PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Anstelle von LIKE und ~, warum nur SIMILAR TO funktioniert, wenn Regex-Matches mit Alternativen durchgeführt werden

LIKE unterstützt den Musterabgleich mit _ für jedes einzelne Zeichen und % für eine beliebige Folge von Zeichen so:

SELECT 'thomas' LIKE '%(h|x)%'

funktioniert nicht, weil LIKE (...) nicht versteht zum Gruppieren oder | zur Abwechslung, das sind nur wörtliche Zeichen in einem LIKE-Muster.

ÄHNLICH ZU unterstützt _ und % das gleiche wie LIKE, fügt aber eine Gruppierung mit (...) hinzu , im Wechsel mit | , und ein paar andere Dinge, also dies:

SELECT 'thomas' SIMILAR TO '%(h|x)%'

funktioniert wie erwartet.

~* verwendet POSIX-Regexes, also (...) ist für die Gruppierung und | steht für Alternation, aber % ist nur ein Prozentzeichen; das bedeutet, dass dies:

SELECT 'thomas' ~* '%(h|x)%'

sucht nach einem h oder x umgeben von Prozentzeichen und funktioniert nicht so, wie Sie es erwarten.

Ihr ~* Version funktioniert, wenn Sie einen geeigneten regulären Ausdruck wie:

verwenden
SELECT 'thomas' ~* '(h|x)' -- alternation
SELECT 'thomas' ~* 'h|x'   -- alternation without an unnecessary grouping
SELECT 'thomas' ~* '[hx]'  -- or a character class

Die oben verlinkte Dokumentation deckt all dies ab.