2009-10-30 1 views
11

Ich möchte etwas laufen wie:Kann ich Wildcards in der MySQL-Anweisung "IN" verwenden?

select * from table where field in ("%apple%", "%orange%") 

Gibt es eine Möglichkeit? Oder gibt es zumindest einen besseren Weg, als dynamisch Abfrage für jedes Schlüsselwort zu erstellen:

select * from table where field like "%apple%" or field like "%orange%" 

Danke.

Antwort

13

Ich bin nicht sicher, es ist besser als das, was Sie kam mit, aber sie MySQL's regex capabilities verwenden:

select * from my_table where field rlike 'apple|orange'; 

auch, wie andere schon erwähnt haben, könnten Sie MySQL's full text search Fähigkeiten nutzen (aber nur, wenn Sie die MyISAM-Engine verwenden).

+0

Ja, sieht wie der einfachste Ansatz aus. Vielen Dank. Hoffentlich hat das keinen großen Einfluss auf die Leistung. – serg

+1

@ serg555: Ich glaube nicht, dass Sie eine gute Leistung aus dem Regex-Ansatz bekommen, weil kein Index verwendet wird. Ich würde die Volltextsuche empfehlen. – Asaph

+0

Ja, aber es hat auch seine Nachteile: nur Myisam-Tabellen, nur ein Ende Wildcards. – serg

1

Vielleicht wäre eine bessere Lösung eine boolean search against a fulltext index zu verwenden?

EDIT: Ich sah es auf und es unterstützt nur Platzhalter am Ende von Wörtern:

ALTER TABLE table ADD FULLTEXT INDEX (field); 

SELECT * FROM table WHERE MATCH (field) 
AGAINST ('orange* apple*' IN BOOLEAN MODE); 
0

In Oracle können Sie tun:

select * from table where 
regexp_like (column, 'apple|orange', 'i') 

können Sie komplexere regexp verwenden. Das 'i' macht es unempfindlich. Siehe Oracle docs