2010-11-24 12 views
0

Ich möchte aus einer Tabelle auswählen, wo ein Feld in einer bestimmten CSV-Zeichenfolge an eine gespeicherte Prozedur übergeben wird.Mysql wählen, wo Feld in csv-Zeichenfolge

Was ist der schnellste Weg, dies zu tun? Soll ich die Werte in eine temporäre Tabelle einfügen und mich damit verbinden? Oder gibt es eine Möglichkeit, dies mit einer Aussage zu tun?

Dank

Antwort

1

NEW ANTWORT -

Nun, Sie haben etwas zu tun, wie unten angegeben. Ich gehe davon aus, dass Ihre CSV-Zeichenfolge wie in Variable @str unten angegeben wäre. Else müssen Sie sicherstellen, dass Ihre Zeichenfolge (oder Arraystring) dieses Format mit einfachen Anführungszeichen für jedes Element haben sollte -

set @str = "'some1','some2','some3'"; 
set @qry1 = CONCAT('select * from testing where col1 in (',@str,')'); 

prepare stmt1 from @qry1; 
execute stmt1; 
deallocate prepare stmt1; 

ALTE ANTWORT -

Ich gehe davon aus, dass Sie die CSV-Datei Pfad gespeichert passieren proc und lese die Zeilen in csv in diesem gespeicherten proc. Also im Grunde können Sie alle speichern diese csv Feldwerte in einer temporären Tabelle und schreiben Abfrage mit IN -

select * from sourceTable 
where fieldValue in (select csvFieldValue from #temptable) 
+0

Nein, es ist keine Datei, nur ein Textfeld wie "token1, token2, token3" usw., das als Parameter übergeben wird. – Chris

+0

@Chris - Bearbeitete meine Antwort. Getestet mit gegebener Zeichenfolge und es funktioniert gut. Sie müssen möglicherweise einige Änderungen am String-Array vornehmen. –

+0

Müssen einige Manipulation der Zeichenfolge im Agenten, um die Zitate richtig zu machen, aber funktioniert gut, Danke! – Chris

0

Did um einige der Suche und fand eine große Antwort :)

Verwenden von MySQL String-Funktion FIND_IN_SET..

Beispiel für die Verwendung:

SET @csvStr = "val1,val2,val3"; 

SELECT Col1 
    FROM Table1 
WHERE FIND_IN_SET(Col2, @csvStr) > 0; 

ich bearbeiten die aktuelle Antwort mit der „New Antwort“ und „Old Antwort“ unter Hinweis darauf, dass die neue Antwort Ihr System auf eine SQL-Injection-Schwachstelle eröffnet.