Verwenden von Regex in WHERE in Postgres

79

Ich habe derzeit die folgende Abfrage:

select regexp_matches(name, 'foo') from table;

Wie kann ich dies so umschreiben, dass sich der reguläre Ausdruck wie folgt befindet (funktioniert nicht):

select * from table where regexp_matches(name, 'foo');

Die aktuelle Fehlermeldung lautet: FEHLER: Das Argument von WHERE muss vom Typ boolean sein, nicht vom Typ text. [] SQL-Status: 42804 Zeichen: 29

David
quelle

Antworten:

139

Schreiben Sie stattdessen:

select * from table where name ~ 'foo'

Der Operator '~' erzeugt ein boolesches Ergebnis dafür, ob der reguläre Ausdruck übereinstimmt oder nicht, anstatt die übereinstimmenden Untergruppen zu extrahieren.

araqnid
quelle
2
Gibt es eine Alternative zum Operator ~? Ich verwende eine Javascript-Bibliothek, die eine Abfrage analysiert und leider ~ und keine Varianten davon erkennt.
Martin
@ Martin Sie könnten versuchen, SIMILAR TO zu verwenden, das die Unterstützung für reguläre Ausdrücke reduziert hat. Weitere Informationen finden SELECT * FROM table WHERE name SIMILAR TO 'foo' Sie in der Dokumentation hier
Josh Frankel
@JoshFrankel: Ich habe irgendwo gelesen (ich denke über Stackoverflow), dass SIMILAR TO eine schlechtere Leistung hat.
Nina
@Nina Möglicherweise bin ich mir nicht sicher. SIMILAR TO verwendet Regex-Funktionen, implementiert sie jedoch nicht vollständig, was es möglicherweise zu einem Sonderfall und damit zu einer geringeren Leistung macht. Ich bevorzuge den ~Regex-Operator, da es keine Überraschungen gibt, was implementiert ist und was nicht, wie es bei SIMILAR TO
Josh Frankel am
@ JoshFrankel: Was ist mit diesem Fall? codereview.stackexchange.com/questions/221146/… das ist eine Frage, die ich kürzlich gepostet habe
Nina
46

Verwenden Sie dort einfach den Match-Operator:

select * from table where name ~ 'foo';
Maxim Sloyko
quelle