PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Au lieu de LIKE et ~, pourquoi seul SIMILAR TO fonctionne lors de la correspondance de regex avec des alternatives

LIKE prend en charge la correspondance de modèles à l'aide de _ pour tout caractère unique et % pour n'importe quelle séquence de caractères donc ceci :

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

ne fonctionne pas car LIKE ne comprend pas (...) pour grouper ou | pour l'alternance, ce ne sont que des caractères littéraux dans un modèle LIKE.

SIMILAIRE À prend en charge _ et % identique à LIKE mais ajoute le groupement avec (...) , alternance avec | , et quelques autres choses donc ceci :

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

fonctionne comme prévu.

~* utilise les regex POSIX donc (...) est pour le regroupement et | est pour l'alternance mais % est juste un signe de pourcentage ; cela signifie que ceci :

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

recherche un h ou x entouré de signes de pourcentage et ne fonctionne pas comme prévu.

Votre ~* version fonctionnera si vous utilisez une expression régulière appropriée comme :

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

La documentation liée ci-dessus couvre tout cela.