Tengo una columna que tiene datos separados por comas:
1,2,3 3,2,1 4,5,6 5,5,5
Estoy intentando ejecutar una búsqueda que consultaría cada valor de la cadena CSV individualmente.
0<first<5 and 1<second<3 and 2<third<4
Entiendo que podría devolver todas las consultas y dividirlas yo mismo y compararlas yo mismo. Tengo curiosidad por saber si hay una manera de hacerlo así que mysql hace ese trabajo de procesamiento. ¡Gracias!
Utilizar
substring_index(`column`,',',1) ==> first value substring_index(substring_index(`column`,',',-2),',',1)=> second value substring_index(substring_index(`column`,',',-1),',',1)=> third value
en tu cláusula where
SELECT * FROM `table` WHERE substring_index(`column`,',',1)<0 AND substring_index(`column`,',',1)>5
Parece funcionar:
substring_index ( substring_index ( context,',',1 ), ',', -1) ) substring_index ( substring_index ( context,',',2 ), ',', -1) ) substring_index ( substring_index ( context,',',3 ), ',', -1) ) substring_index ( substring_index ( context,',',4 ), ',', -1) )
significa primer valor, segundo, tercero, etc.
El substring_index
interno devuelve los primeros n valores que están separados por comas. Entonces, si su cadena original es “34,7,23,89”, substring_index( context,',', 3)
devuelve “34,7,23”.
El substring_index
externo toma el valor devuelto por el substring_index
interno y el -1
permite tomar el último valor. Entonces obtienes “23” del “34,7,23”.
En lugar de -1
si especifica -2
, obtendrá “7,23”, porque tomó los dos últimos valores.
select * from MyTable where substring_index(substring_index(prices,',',1),',',-1)=3382;
Aquí, prices
es el nombre de una columna en MyTable
.
Por lo general substring_index hace lo que quiere:
mysql> select substring_index("foo@gmail.com","@",-1); +-----------------------------------------+ | substring_index("foo@gmail.com","@",-1) | +-----------------------------------------+ | gmail.com | +-----------------------------------------+ 1 row in set (0.00 sec)
Puede obtener lo que quiere utilizando el REGEXP de MySQL o LIKE.
Ver los documentos de MySQL sobre coincidencia de patrones
Como una adición a esto, tengo cadenas de la forma: algunas palabras 303
donde me gustaría dividir la parte numérica de la cola de la cadena. Esto parece apuntar a una posible solución:
http://lists.mysql.com/mysql/222421
El problema, sin embargo, es que solo obtiene la respuesta “sí, coincide”, y no el índice de inicio de la coincidencia de expresiones regulares.
Aquí hay otra variante que publiqué en una pregunta relacionada. La comprobación de REGEX
para ver si está fuera de límites es útil, por lo que para una columna de tabla la pondría en la cláusula where.
SET @Array = 'one,two,three,four'; SET @ArrayIndex = 2; SELECT CASE WHEN @Array REGEXP CONCAT('((,).*){',@ArrayIndex,'}') THEN SUBSTRING_INDEX(SUBSTRING_INDEX(@Array,',',@ArrayIndex+1),',',-1) ELSE NULL END AS Result;
SUBSTRING_INDEX(string, delim, n)
devuelve la primera n SUBSTRING_INDEX(string, delim, -1)
devuelve el último REGEXP '((delim).*){n}'
comprueba si hay n delimitadores (es decir, usted está dentro de límites) Esta funcionando..
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX( SUBSTRING_INDEX(SUBSTRING_INDEX(SUBSTRING_INDEX(col,'1', 1), '2', 1), '3', 1), '4', 1), '5', 1), '6', 1) , '7', 1), '8', 1), '9', 1), '0', 1) as new_col FROM table_name group by new_col;