2009-07-08 12 views
47

Ho un colonna che ha una virgola i dati separati:Can Mysql Dividere una colonna?

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

Sto cercando di eseguire una ricerca che interroga ciascuno valore della stringa CSV individualmente.

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

Ho capito che potevo restituire tutte le domande e dividerlo da solo e confrontarlo da solo. Sono curioso di sapere se esiste un modo per farlo, quindi mysql fa funzionare quell'elaborazione. Grazie!

risposta

1

Come un addendum a questo, ho le stringhe del modulo: Alcune parole 303

dove mi piacerebbe dividere via la parte numerica dalla coda della stringa . Ciò sembra indicare una possibile soluzione:

http://lists.mysql.com/mysql/222421

Il problema però, è che si ottiene solo la risposta "sì, considerate le stringhe", e non l'indice di inizio della partita regexp.

41

Usa

substring_index(`column`,',',1) ==> first value 
substring_index(substring_index(`column`,',',-2),',',1)=> second value 
substring_index(substring_index(`column`,',',-1),',',1)=> third value 

nella vostra clausola dove.

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

Ho dovuto usare substring_index (substring_index ('column', ',', - 1), ',', 1) per ottenere il secondo valore. Usare -2 mi ha dato costantemente il primo valore. Ha funzionato alla grande, però. :) –

+0

Gli indici di questa risposta diventano un po 'confusi quando si aggiungono più righe. – Tom

0

Si sta lavorando ..

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

Ecco un'altra variante che ho postato su domanda relativa. Il controllo REGEX per vedere se sei fuori limite è utile, quindi per una colonna della tabella lo inseriresti nella clausola 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) restituisce il primo n
  • SUBSTRING_INDEX(string, delim, -1) restituisce l'ultimo solo
  • REGEXP '((delim).*){n}' controlla se ci sono n delimitatori (vale a diresi è in limiti)
7

solito substring_index fa ciò che si vuole:

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

Davvero utile ... –

12

Sembra funzionare:

substring_index (substring_index (contesto, '', 1), '' , -1))
substring_index (substring_index (contesto, '', 2), ' ' -1))
substring_index (substring_index (contesto,', ' 3),',', - 1))
substring_index (substring_index (contesto, '', 4), '', -1))

significa 1 ° valore, 2 °, 3 °, ecc

Spiegazione:
Il inner substring_index restituisce i primi n valori separati da virgola. Quindi, se la tua stringa originale è "34,7,23,89", substring_index(context,',', 3) restituisce "34,7,23".
L'esterno substring_index prende il valore restituito dall'interno substring_index e lo -1 consente di prendere l'ultimo valore. Quindi ottieni "23" da "34,7,23".
Invece di -1 se si specifica -2, si otterrà "7,23", perché ha preso gli ultimi due valori.

Esempio:
select * from MyTable where substring_index(substring_index(prices,',',1),',',-1)=3382;
Qui, prices è il nome di una colonna in MyTable.

+1

Questo è quello che ha funzionato per me. Grazie Oleksiy! – Nav

+0

Questa è la risposta più chiara dato che gli indici sono più strutturati. – Tom