¿Puede Mysql dividir una columna?

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.

Explicación:

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.

Ejemplo:

 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;