PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Invece di LIKE e ~, perché solo SIMILAR TO funziona quando si esegue una corrispondenza regolare con alternative

LIKE supporta la corrispondenza dei modelli utilizzando _ per ogni singolo carattere e % per qualsiasi sequenza di caratteri quindi questo:

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

non funziona perché LIKE non comprende (...) per il raggruppamento o | in alternativa, quelli sono solo caratteri letterali in uno schema LIKE.

SIMILI A supporta _ e % lo stesso di LIKE ma aggiunge il raggruppamento con (...) , alternanza con | , e poche altre cose, quindi questo:

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

funziona come previsto.

~* usa le espressioni regolari POSIX quindi (...) è per il raggruppamento e | è per alternanza ma % è solo un segno di percentuale; ciò significa che questo:

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

sta cercando un h o x circondato da segni di percentuale e non funziona come ti aspetti.

Il tuo ~* la versione funzionerà se usi un'espressione regolare corretta come:

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

La documentazione collegata sopra copre tutto questo.