2017-10-19 2 views
0

Avec l'exemple ci-dessous, j'ai seulement TRUE avec l'expression SIMILAR TO; LIKE et ~ les deux ont montré FAUX (a échoué à travailler ici je suppose?)Au lieu de LIKE et ~, pourquoi seulement SIMILAR TO fonctionne quand faire regex correspond avec des alternatives

Comme SIMILAR TO n'est pas favorable dans de nombreux messages SO, je voudrais savoir s'il y a un moyen de faire correspondre regex avec des alternatives en utilisant LIKE ou ~ .

SELECT 'thomas' SIMILAR TO '%(h|x)%' 
-- result: t 

SELECT 'thomas' LIKE '%(h|x)%' 
-- result: f 

SELECT 'thomas' ~* '%(h|x)%' 
-- result: f 
+1

Où dans [le manuel] (https://www.postgresql.org/docs/current/static/functions-matching.html#functions-like) avez-vous eu cette impression? –

+0

* N'utilisez jamais 'SIMILAR TO': https://stackoverflow.com/a/12459689/939860 –

Répondre

5

LIKE prend en charge correspondant à motif à l'aide _ pour un seul caractère et % pour toute séquence de caractères si ceci:

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

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

SIMILAR TO soutient _ et % les mêmes que voulez, mais adds groupement avec (...), alternance avec |, et quelques autres choses si cela:

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

fonctionne comme prévu.

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

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

recherche un h ou x entouré de signes de pourcentage et ne fonctionne pas leur façon vous vous attendez à.

Votre version ~* fonctionnera si vous utilisez une expression régulière à proprement parler 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 à couvre-dessus tout cela. `LIKE` ne prend pas en charge les expressions régulières

0

Vous pouvez utiliser ~ * dans ce cas:

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

ou

SELECT 'thomas' ~* 'h|x' 

Gardez à l'esprit que vous devez utiliser la syntaxe POSIX avec regex ~, ~ * opérateurs.