web-dev-qa-db-fra.com

Expression régulière dans la clause LIKE de PostgreSQL

Je suis coincé avec une simple expression régulière. Je ne sais pas ce que je manque. Un peu rouillé sur les compétences regex.

L'expression que j'essaie de faire correspondre est:

select * from table where value like '00[1-9]%'
-- (third character should not be 0)

Cela devrait donc correspondre à '0090D0DF143A' (format: texte) mais ce n'est PAS!

19
borarak

Comme @ a_horse commenté , vous devez utiliser opérateur d'expression régulière ~ pour utiliser expressions entre crochets .
Mais il y a plus. Je suggère:

SELECT *
FROM   tbl
WHERE  value ~ '^00[^0]'

^ ... correspond au début de la chaîne (votre expression d'origine peut correspondre à n'importe quel position).
[^0] ... une expression de parenthèse (classe de caractères) correspondant à n'importe quel caractère qui n'est pas 0.

Ou mieux , pourtant:

SELECT *
FROM   tbl
WHERE  value LIKE '00%'       -- starting with '00'
AND    value NOT LIKE '000%'  -- third character is not '0'

Pourquoi? LIKE n'est pas aussi puissant, mais généralement plus rapide que les expressions régulières. Il est probablement beaucoup plus rapide de réduire l'ensemble des candidats avec une expression LIKE bon marché.

En règle générale, vous utiliseriez NOT LIKE '__0', mais puisque nous établissons déjà LIKE '00%' dans l'autre prédicat, nous pouvons utiliser le modèle plus étroit (moins cher) NOT LIKE '000'.

Postgres peut utiliser un simple index btree pour les expressions ancrées à gauche value LIKE '00%' (important pour les grandes tables), alors que cela pourrait ne pas fonctionner pour une expression régulière plus complexe. La dernière version de Postgres peut utiliser des index pour les expressions régulières simples, donc cela pourrait fonctionner pour cet exemple. Détails:

30
Erwin Brandstetter

L'opérateur LIKE de PostgreSQL ne prend pas en charge [ charlist], cependant SIMILAR TO Est-ce que.

consultez [~ # ~] ici [~ # ~] pour une liste complète des bases de données

0
sunbabaphu