2010-02-02 101 views

Respuesta

5

Puede hacerlo de dos maneras:

  1. SQL Library
  2. Natively with REGEXP
+2

Ok, ¿puede ser más específico? –

+0

Pero la idea con Regex es genial –

+4

Según el enlace, las respuestas únicas no son buenas prácticas. Sé que esto es antiguo, pero quería dejar este comentario de todos modos con la esperanza de que regreses y mejoras esta respuesta. Particularmente dado que seguir esos dos enlaces no dice inmediatamente cómo aplicar esto al problema, por lo que ni siquiera son realmente grandes enlaces para responder la pregunta por sí mismos. (para la discusión de las respuestas de solo enlace ver http://meta.stackexchange.com/questions/8231/are-answers-that-just-contain-links-elsewhere-really-good-answers) – Chris

3

usted podría intentar este ejemplo MySQL. Antes de usarlo, ingrese algunos controles de seguridad (por ejemplo, la identificación de verificación es un número entero o coincide con la expresión regular antes de insertar).

# BEGIN split statements ids 
DECLARE current_pos INT DEFAULT 1; 
DECLARE delim CHAR DEFAULT ','; 
DECLARE current CHAR DEFAULT ''; 
DECLARE current_id VARCHAR(100) DEFAULT '';; 
CREATE TEMPORARY TABLE ids (`id` VARCHAR(100)); 
split_ids: LOOP 
    SET current = MID(statement_ids, current_pos, 1); 
    IF (current_pos = LENGTH(statement_ids)) THEN 
    IF current != delim THEN SET current_id = CONCAT(current_id,current); END IF; 
    INSERT INTO ids(id) VALUES (current_id); 
    LEAVE split_ids; 
    END IF; 
    IF current = delim THEN 
    INSERT INTO ids(id) VALUES (current_id); 
    SET current_id = ''; 
    ELSE 
    SET current_id = CONCAT(current_id,current); 
    END IF; 
    SET current_pos = current_pos+1; 
END LOOP split_ids; 
# END split statement ids 

# to check ids are correct 
SELECT * FROM ids; 

# to use the ids: 
SELECT * FROM statements WHERE id IN (SELECT id FROM ids); 
2

bien, un poco, pero de manera menos geek "más fácil" para gente como yo:

decir que tiene una tabla 'combined_city_state' que se parece a:

'Chicago, Illinois' 

copia que al 2 de otra tablas:

CREATE TABLE city LIKE combined_city_state; 
INSERT city SELECT * FROM combined_city_state; 

CREATE TABLE state LIKE combined_city_state; 
INSERT state SELECT * FROM combined_city_state; 

Ahora tiene 3 tablas con los mismos datos que 'combined_city_state'.

Instalar esta función:

CREATE FUNCTION SPLIT_STR(
    x VARCHAR(255), 
    delim VARCHAR(12), 
    pos INT 
) 
RETURNS VARCHAR(255) 
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(x, delim, pos), 
     LENGTH(SUBSTRING_INDEX(x, delim, pos -1)) + 1), 
     delim, ''); 

A continuación, aplicar esto a cada tabla para eliminar el índice adicional de los datos:

UPDATE firms 
SET city = (SELECT SPLIT_STR((city), ',', 1)); 


UPDATE firms 
SET state = (SELECT SPLIT_STR((state), ',', 2)); 

Esto le deja con una columna de sólo ciudades, una de sólo los Estados . Ahora puede eliminar la columna original 'combined_city_state' si ya no la necesita.

5

Puede usar una declaración preparada dentro del procedimiento almacenado para lograr esto. Puede crear la consulta de selección completa como una cadena dentro de una variable y luego concatenar en la cadena delimitada por comas en su cláusula IN. Luego puede hacer una declaración preparada a partir de la variable de cadena de consulta y ejecutarla.

DELIMITER ;; 
create procedure testProc(in listString varchar(255)) 

BEGIN 

set @query = concat('select * from testTable where id in (',listString,');'); 
prepare sql_query from @query; 
execute sql_query; 

END 
;; 

DELIMITER ; 

call testProc("1,2,3"); 
0

He analizado datos con guiones en el mismo. El siguiente ejemplo utiliza una cadena de texto fijo para demostrar, simplemente cambie las referencias a los nombres de columna relevantes en la tabla. Jugué durante siglos con una forma de asegurarme de que funcionó en códigos con distintos números de componentes y al final decidí agregar la cláusula where. La mayoría de los datos que intenta analizar tienen una cantidad fija de columnas.

select 
SUBSTRING_INDEX(TS,"-",1) as "1", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",2)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",2)))-1)) as "2", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",3)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",3)))-1)) as "3", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",4)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",4)))-1)) as "4", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",5)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",5)))-1)) as "5", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",6)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",6)))-1)) as "6",reverse(left(reverse(SUBSTRING_INDEX(TS,"-",7)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",7)))-1)) as "7", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",8)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",8)))-1)) as "8", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",9)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",9)))-1)) as "9", 
reverse(left(reverse(SUBSTRING_INDEX(TS,"-",10)),locate("-",reverse(SUBSTRING_INDEX(TS,"-",10)))-1)) as "10" 
from (select "aaa-bbb-ccc-ddd-eee-fff-ggg-hhh-iii-jjj" as TS) as S 
where (LENGTH(TS)-LENGTH(REPLACE(TS,'-',''))) =9 
1

Me sorprende esta sola línea no está correctamente menciona aquí:

SELECT * FROM table 
WHERE id in (SELECT convert(int,Value) FROM dbo.Split(@list_string,',') 

Todo lo que necesita es un Split SQL function como la siguiente, que será muy útil en otras formas también:

CREATE FUNCTION dbo.Split 
(
    @List nvarchar(2000), 
    @SplitOn nvarchar(5) 
) 
RETURNS @RtnValue table 
(

    Id int identity(1,1), 
    Value nvarchar(100) 
) 
AS 
BEGIN 
While (Charindex(@SplitOn,@List)>0) 
Begin 
    Insert Into @RtnValue (value) 
    Select 
     Value = ltrim(rtrim(Substring(@List,1,Charindex(@SplitOn,@List)-1))) 
     Set @List = Substring(@List,Charindex(@SplitOn,@List)+len(@SplitOn),len(@List)) 
End 

Insert Into @RtnValue (Value) 
Select Value = ltrim(rtrim(@List)) 

Return 
END 
+1

Esto es MSSQL T-SQL, no MySQL – joezen777

33

esto es simple como el demonio de MySQL:

SELECT * FROM table WHERE FIND_IN_SET(table.id, commaSeparatedData); 

Referencia: http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

+3

Wow. ¡Eso era exactamente lo que estaba buscando! Gracias. Esta debería ser la respuesta correcta, creo. –

+0

@JimmyKane Sí, también pienso así, pero lamentablemente ya hay una respuesta correcta :) – DarkSide

+1

@ Peter Stegnar Debería considerar cambiar la mejor respuesta. –

Cuestiones relacionadas