2009-07-08 11 views
47

Ich habe eine Spalte, die getrennten Daten Komma hat:Kann Mysql eine Spalte aufteilen?

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

Ich versuche, eine Suche auszuführen, die jeden Wert der CSV-String einzeln abfragen würde.

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

Ich bekomme, dass ich alle Abfragen zurückgeben und es selbst teilen und es selbst vergleichen könnte. Ich bin neugierig, ob es eine Möglichkeit gibt, dies zu tun, so dass mysql diese Verarbeitung macht. Danke!

Antwort

1

Als Nachtrag zu diesem, ich Saiten der Form haben: Einige Wörter 303

wo Ich mag würde den numerischen Teil aus dem Schwanz des Strings abzuspalten . Dies scheint auf eine mögliche Lösung zu Punkt:

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

Das Problem ist jedoch, dass Sie nur die Antwort bekommen: „Ja, es passt“, und nicht der Startindex des regexp übereinstimmen.

41

Verwenden

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

in Ihrer where-Klausel.

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

Ich musste substring_index (substring_index ('column', ',', - 1), ',', 1) verwenden, um den zweiten Wert zu erhalten. Die Verwendung von -2 gab mir immer den ersten Wert. Hat aber super funktioniert. :) –

+0

Die Indizes in dieser Antwort werden ein wenig verwirrend, wenn Sie weitere Zeilen hinzufügen. – Tom

0

Es funktioniert ..

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

Hier ist eine weitere Variante I auf ähnliche Frage gestellt. Die REGEX Überprüfung, ob Sie außerhalb der Grenzen sind, ist nützlich, also würden Sie sie für eine Tabellenspalte in die Where-Klausel einfügen.

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) gibt die ersten n
  • SUBSTRING_INDEX(string, delim, -1) die letzte liefert nur
  • REGEXP '((delim).*){n}' prüft, ob n Begrenzer (d.h.Sie befinden sich in Grenzen)
7

Normalerweise substring_index tut, was Sie wollen:

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

Wirklich nützlich ... –

12

Es scheint zu funktionieren:

SUBSTRING_INDEX (SUBSTRING_INDEX (Kontext, '', 1), '' , -1))
SUBSTRING_INDEX (SUBSTRING_INDEX (context, '', 2), ' ' -1))
SUBSTRING_INDEX (SUBSTRING_INDEX (context,', ' 3),',', - 1))
SUBSTRING_INDEX (SUBSTRING_INDEX (Kontext, '', 4), '', -1))

bedeutet es erste Wert, 2., 3., usw.

Erläuterung:
Die inner substring_index gibt die ersten n Werte zurück, die durch Kommas getrennt sind. Wenn also Ihre ursprüngliche Zeichenfolge "34,7,23,89" lautet, gibt substring_index(context,',', 3) "34,7,23" zurück.
Die äußere substring_index nimmt den Wert von der inneren substring_index zurückgegeben und die -1 ermöglicht es Ihnen, den letzten Wert zu nehmen. Sie erhalten also "23" von "34,7,23".
Anstatt -1 Wenn Sie -2 angeben, erhalten Sie "7,23", weil die letzten beiden Werte verwendet wurden.

Beispiel:
select * from MyTable where substring_index(substring_index(prices,',',1),',',-1)=3382;
Hier prices ist der Name einer Spalte in MyTable.

+1

Das hat bei mir funktioniert. Danke Oleksiy! – Nav

+0

Dies ist die klarere Antwort, da die Indizes strukturierter sind. – Tom

Verwandte Themen