2 votes

Clause WHERE de Postgres SQL avec 'OR' dans la correspondance des motifs

J'ai des chaînes de 010xxx, 011xxx, 110xxx, 111xxx, Q10xxx, Q11xxx dans un champ avec d'autres valeurs qui ne sont pas similaires. Il peut s'agir XyzABC .

J'ai deux modèles d'expressions rationnelles qui donnent séparément de bons résultats : [1Q]_[0-9]% y 0_[1-9]%

En d'autres termes, renvoyer vrai si

first letter is 1 or Q and the 3rd letter is a 0-9 

OR 

the first letter is 0 and the third letter is 1-9

Comment créer un modèle de recherche qui effectue le OU à l'aide de SIMILAR TO ou de regex ?

Une version qui fonctionne toute seule est la suivante :

SELECT field FROM db WHERE field SIMILAR TO '[1Q]_[0-9]%'

Pas de contrainte de SIMILAR ou de regex. C'est ce que j'ai réussi à faire fonctionner jusqu'à ce que j'essaie de or les. Ouvert à d'autres suggestions.

3voto

Wiktor Stribiżew Points 100073

Vous pouvez utiliser un SIMILAR TO modèle comme

WHERE field SIMILAR TO '([1Q]_[0-9]|0_[1-9])%'

Le motif SIMILAR TO exige une correspondance avec une chaîne de caractères complète, ce qui signifie que le motif signifie : commence par 1 o Q puis n'importe quel caractère, puis n'importe quel chiffre, ou commencer par 0 , n'importe quel caractère et un chiffre non nul, et ensuite il peut y avoir n'importe quel 0 ou plusieurs caractères.

Vous pouvez également utiliser une expression rationnelle comme

WHERE field ~ '^(?:[1Q].[0-9]|0.[1-9])'

Voir le Démonstration des expressions rationnelles

Détails :

  • ^ - début de la chaîne
  • (?: - début d'un groupe non capturant :
    • [1Q].[0-9] - 1 o Q , un caractère quelconque et un chiffre
  • | - ou
    • 0.[1-9] - 0 , un caractère quelconque et un chiffre non nul
  • ) - fin d'un groupe non capturant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X