2009-07-08 19 views
47

tengo una columna que se ha separado por comas de datos:Can Mysql ¿Dividir una columna?

1,2,3 
3,2,1 
4,5,6 
5,5,5 

Estoy tratando de ejecutar una búsqueda que consultar cada valor de la cadena CSV de forma individual.

0<first<5 and 1<second<3 and 2<third<4 

Entiendo que podría responder 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!

Respuesta

1

Como una adición a esto, he cadenas de la forma: Algunas palabras 303

donde me gustaría a escindir 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 sólo se obtiene la respuesta "sí, coincide", y no el índice de comienzo del partido expresión regular.

41

Uso

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 su cláusula where.

SELECT * FROM `table` 
WHERE 
substring_index(`column`,',',1)<0 
AND 
substring_index(`column`,',',1)>5 
+2

Tuve que usar substring_index (substring_index ('column', ',', - 1), ',', 1) para obtener el segundo valor. Usar -2 constantemente me dio el primer valor. Funcionó muy bien, sin embargo. :) –

+0

Los índices en esta respuesta se vuelven un poco confusos a medida que agrega más filas. – Tom

0

Está 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; 
1

Aquí es otra variante que he publicado en la pregunta relacionada. El control REGEX para ver si está fuera de límites es útil, por lo que para una columna de tabla lo 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 el primer n
  • SUBSTRING_INDEX(string, delim, -1) devuelve el último sólo
  • REGEXP '((delim).*){n}' comprueba si hay n delimitadores (es decir,se encuentra en los límites)
7

Por lo general substring_index hace lo que quiere:

mysql> select substring_index("[email protected]","@",-1); 
+-----------------------------------------+ 
| substring_index("[email protected]","@",-1) | 
+-----------------------------------------+ 
| gmail.com        | 
+-----------------------------------------+ 
1 row in set (0.00 sec) 
+0

Realmente útil ... –

12

Parece que funciona:

SUBSTRING_INDEX (SUBSTRING_INDEX (contexto, '', 1 '), '' , -1))
SUBSTRING_INDEX (SUBSTRING_INDEX (contexto, '', 2), ' ' -1))
SUBSTRING_INDEX (SUBSTRING_INDEX (contexto,', ' 3),',', - 1))
SUBSTRING_INDEX (SUBSTRING_INDEX (contexto, '', 4), '', -1))

que significa primero valor, segundo, tercero, etc.

Explicación:
El inner substring_index 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 le 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.

+1

Esto es lo que funcionó para mí. Gracias Oleksiy! – Nav

+0

Esta es la respuesta más clara dado que los índices están más estructurados. – Tom

Cuestiones relacionadas