Script Split Base de datos
Hoy voy a publicar una función que utilizo para realizar split en SQL Server 2000 recomendables para realizar búsquedas de cadenas, nombres, entre otras.
CREATE FUNCTION Split(@String varchar(150), @Delimiter char(1))
RETURNS varchar(200)
AS
BEGIN
DECLARE @INDEX INT
DECLARE @Results varchar(200)
DECLARE @SLICE varchar(200)
-- Asignar 1 a la variable que utilizaremos en el loop para no iniciar en 0.
SELECT @INDEX = 1
-- Asignar Results = '' para no devolver null y prevenir errores.
SET @Results = ''
IF @String IS NULL RETURN @Results
WHILE @INDEX !=0
BEGIN
-- Obtenemos el índice de la primera ocurrencia del split de caracteres.
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- Ahora ponemos todo a la izquierda de el slice de la variable.
IF @INDEX != 0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1) + '%'
ELSE
SELECT @SLICE = @STRING
SET @Results = @Results + @SLICE
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- Salimos del loop si terminamos la búsqueda
IF LEN(@STRING) = 0 BREAK
END
RETURN @Results --Retornamos el resultado de la misma
END
CREATE FUNCTION Split(@String varchar(150), @Delimiter char(1))
RETURNS varchar(200)
AS
BEGIN
DECLARE @INDEX INT
DECLARE @Results varchar(200)
DECLARE @SLICE varchar(200)
-- Asignar 1 a la variable que utilizaremos en el loop para no iniciar en 0.
SELECT @INDEX = 1
-- Asignar Results = '' para no devolver null y prevenir errores.
SET @Results = ''
IF @String IS NULL RETURN @Results
WHILE @INDEX !=0
BEGIN
-- Obtenemos el índice de la primera ocurrencia del split de caracteres.
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- Ahora ponemos todo a la izquierda de el slice de la variable.
IF @INDEX != 0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1) + '%'
ELSE
SELECT @SLICE = @STRING
SET @Results = @Results + @SLICE
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- Salimos del loop si terminamos la búsqueda
IF LEN(@STRING) = 0 BREAK
END
RETURN @Results --Retornamos el resultado de la misma
END
Comentarios
Gracias! la necesito mucho
De seguro que si se puede, enviame tu correo para enviartela para MySql a elymichael@gmail.com
miren necesito separar la siguiente cadena AREA-FONO-FECHA_NOMBre necesito que area , fono, fech,nombre queden en diferentes columnas en sql server como hago eso porfa si me puedes ayudar estare muy agradecida
Lo primero seria tener los delimitadores estandarizados, es decir, si vas a usar "-", delimitar lo que desees con eso, luego ejecutas la funcion
"select dbo.Split('AREA-FONO-FECHA-NOMBRE','-')"
y obtendras lo que deseas,
Espero te ayude
sólo me retorna el mismo string pero reemplanzando '-' por '%'.
Plop !
¿Qué estoy haciendo mal?
Yo denuevo... el siguiente link tiene un split que retorna registros con los valores del string separados..
revísenlo:
http://geekswithblogs.net/AngelEyes/archive/2007/04/12/111504.aspx
Gracias
No conozco Firebird, pero me imagino que no debe ser muy complicado, ya que está diseña en más de un 80% en SQL puro, voy a investigar un poco y te dejo saber.
BEGIN
DECLARE POS INT;
DECLARE NEXTPOS INT;
DECLARE VALOR VARCHAR(100);
DECLARE LEN INT;
SET NEXTPOS = 0;
SET LEN = CHAR_LENGTH(STR) -1;
SET POS=0;
DROP TEMPORARY TABLE IF EXISTS TEMP;
CREATE TEMPORARY TABLE IF NOT EXISTS TEMP(
VAL VARCHAR(100)
) ;
SET VALOR = SUBSTRING_INDEX(STR,DELIMITADOR,1);
INSERT INTO TEMP SELECT VALOR;
WHILE NOT POS > LEN + 2 DO
SET STR = SUBSTRING(STR,CHAR_LENGTH(VALOR)+2,LEN-CHAR_LENGTH(VALOR));
SET POS = POS + CHAR_LENGTH(VALOR)+2;
SET VALOR = SUBSTRING_INDEX(STR,DELIMITADOR,1);
INSERT INTO TEMP SELECT VALOR;
END WHILE;
SELECT * FROM TEMP;
END
CREATE FUNCTION Split(@String varchar(150), @Delimiter char(1))
RETURNS @Results table (word varchar(50))
AS
BEGIN
DECLARE @INDEX INT
DECLARE @SLICE varchar(200)
-- Asignar 1 a la variable que utilizaremos en el loop para no iniciar en 0.
SELECT @INDEX = 1
WHILE @INDEX !=0
BEGIN
-- Obtenemos el índice de la primera ocurrencia del split de caracteres.
SELECT @INDEX = CHARINDEX(@Delimiter,@STRING)
-- Ahora ponemos todo a la izquierda de el slice de la variable.
IF @INDEX != 0
SELECT @SLICE = LEFT(@STRING,@INDEX - 1)
ELSE
SELECT @SLICE = @STRING
insert into @Results(word) values(@SLICE)
SELECT @STRING = RIGHT(@STRING,LEN(@STRING) - @INDEX)
-- Salimos del loop si terminamos la búsqueda
IF LEN(@STRING) = 0 BREAK
END
RETURN
END
me arias un mega favor
La versión de MySQL que tenía para estas pruebas era la 5.0
:)