| Documentation PostgreSQL 7.2 | ||
|---|---|---|
| <<< Previous | Fonctions et Opérateurs | Next >>> |
Il y a deux approches séparées pour le filtrage fournies par PostgreSQL: l'opérateur SQL LIKE et les expressions régulières en style POSIX.
![]() | Si vous avez des nécessités de filtrage qui vont au-delà, il vaut mieux écrire une fonction utilisateur en Perl ou Tcl. |
string LIKE pattern [ ESCAPE escape-character ] string NOT LIKE pattern [ ESCAPE escape-character ] |
Chaque filtre définit un ensemble de chaînes. L'expression LIKE renvoie true si la string est contenue dans un ensemble de chaînes représentées par pattern. (Comme prévu, l'expression NOT LIKE retourne false si LIKE retourne true, et vice versa. Une expression équivalente est NOT (string LIKE pattern).)
Si pattern ne contient pas de signes de pourcentage ou souligné, alors le pattern seul représente la chaîne elle-même; dans ce cas LIKE agit comme opérateur d'égalité. Un souligné (_) dans pattern est en attente d'un cractère unique; un signe de pourcentage (%) apparie une chaîne de zéro caractères ou plus.
Quelques exemples :
'abc' LIKE 'abc' true 'abc' LIKE 'a%' true 'abc' LIKE '_b_' true 'abc' LIKE 'c' false |
Les filtres LIKE couvrent toujours la chaîne entière. Pour placer un filtre quelque part dans une chaîne, le filtre doit démarrer et finir avec un signe pourcentage.
Pour apparier un signe souligné ou pourcentage sans apparier d'autres caractères, le caractère respectif dans le filtre doit être précédé par un caractère d'échappement. Le caractère d'achappement par défaut est le backslash mais un caractère différent peut être sélectionné en utilisant l'instruction ESCAPE. Pour apparier le caractère d'échappement lui-même, écrire deux caractères d'échappement.
Notez que le backslash a déjà une signification spéciale dans les chaînes, aussi pour écrire un filtre constant qui contient un backslash vous devrez écrire deux backslash dans la requête. Ainsi, écrire un filtre qui apparie un backslash littéral conduit à écrire quatre backslashes dans la requête. Vous pouvez éviter ça en sélectionnant un caractère d'échappement différent avec ESCAPE; alors le backslash ne sera plus particulier à LIKE. (Mais c'est encore spécial pour l'analyseur de chaîne, ainsi vous aurez toujours besoin de deux de ceux-ci).
Il est aussi possible de ne pas sélectionner de caractère d'échappement en écrivant ESCAPE ''. Dans ce cas il n'y a pas de moyen d'éviter la signification spéciale des signes pourcentage et souligné dans le filtre.
Le mot-clé ILIKEpeut être utilisé à la place de LIKE pour rendre l'appariement insensible à la casse pour la locale. Ce n'est pas un standard SQL mais une extension de PostgreSQL.
L'opérateur ~~ est équivalent à LIKE, et ~~* correspond à ILIKE. Il y a aussi les opérateurs !~~ et !~~* qui représentent NOT LIKE et NOT ILIKE. Tous ces opérateurs sont spécifiques à PostgreSQL.
Table 10. Regular Expression Match Operators
| Opérateur | Description | Exemple |
|---|---|---|
| ~ | Matches regular expression, case sensitive | 'thomas' ~ '.*thomas.*' |
| ~* | Matches regular expression, case insensitive | 'thomas' ~* '.*Thomas.*' |
| !~ | Does not match regular expression, case sensitive | 'thomas' !~ '.*Thomas.*' |
| !~* | Does not match regular expression, case insensitive | 'thomas' !~* '.*vadim.*' |
Les expressions régulières POSIX permettent plus de puissance pour le filtrage que la fonction LIKE Plusieurs outils Unix comme egrep, sed, ou awk utilisent un langage de filtrage qui est similaire à celui décrit ici.
Une expression régulière est une suite de caractères qui est une définition abrégée d'un ensemble de chaînes (un ensemble régulier). Une chaîne est dite appariée à une expression régilière si c'est un membre régulièrement décrit par l'expression régulière. Comme avec LIKE, les caractères filtre apparie les chaînes de caractères exactement à moins qu'ils aient des caractères spéciaux dans dans le langage de l'expression régulière --- mais les expressions régulières utilisent des caractères spéciaux différents que LIKE. À l'inverse des filtres LIKE, une expression régulière peut s'apparier n'importe où dans une chaîne, à moins que l'expression régulière soit explicitement ancrée au début ou à la fin de la chaîne.
Les expressions régulières ("RE"s), comme définies dans POSIX 1003.2, prennent deux formes :les REs modernes (en gros celles de egrep; 1003.2 appelées REs "étendues") et les REs obsolètes (en gros celles de ed; 1003.2 les REs "basiques"). PostgreSQL implémente la forme moderne.
Une RE (moderne) est une ou plusieurs branches non vides, séparées par des |.
Une branche est une ou plusieurs pièces, concatenées.
Une pièce est un atome qui peut être suivi d'un seul *, +, ?, ou limite. Un atome suivi par * apparie une suite de 0 ou plus d'atomes. Un atome suivi par + apparie un suite de 1 ou plus d'atomes. Un atome suivi par ? apparie une suite de 0 ou 1 atome.
Une limite (bound) est { suivie par un entier décimal non signé, peut être suivie par , peut être suivie par un entier décimal non signé toujours suivie par }. Les entiers doivent s'étendre de 0 à RE_DUP_MAX (255) inclu, et s'il y en a deux, le premier ne doit pas excéder le second. Un atome suivi d'une limite contenant un entier i et pas de virgule apparie une suite exacte de i de l'atome. Un atome suivi par une limite contenant un entier i et une virgule apparie une suite de i ou plus d'atomes. Un atome suivi par une limite contenant deux entiers i et j apparie une suite de i à travers j (inclusif) d'atomes.
![]() | Un opérateur de répétition *, +, ou limites) ne peut suivre un autre opérateur de répétition. Un opérateur de répétition ne peut débuter une expression ou un sous-expression ou suivre ^ ou |. |
Un atome est une expression régulière insérée dans () (s'appariant à une expression régulière), un ensemble vide de () (appariant la chaîne null), une expression entre parenthèses (voir plus bas), . (appariant n'importe quel caractère unique), ^ (appariant la chaîne null au début de l'entrée chaîne), $ (appariant la chaîne null à la fin de l'entrée chaîne), un \ suivi par un des caractères ^.[$()|*+?{\ (appariant ce caractère pris comme cractère ordinaire), un \ suivi par un autre caractère (appariant ce caractère pris comme caractère ordinaire, comme si le \ n'avait pas été présent), ou un caractère unique sans autre signification (appariant ce caractère). Un { suivi par un caractère autre qu'un chiffre est un caractère ordinaire, pas le début d'une limite. Il est illégal de terminer une RE avec un \.
Notez que le backslash (\) possède déja un comportement spécial dans les chaînes littérales, ainsi pour écrire une constante filtre qui contient un backslash vous devez écrire deux backslashes dans la requête.
Une expression entre parenthèses est une suite de caractères insérés dans des []. Il s'apparie normalement à un caractère unique de la suite (voir plus bas). Si la suite débute avec un ^, elle s'apparie à n'importe quel caractère unique (voir plus bas) pas au reste de la liste. Si deux caractères de la suite sont séparés par des -, c'est sténographiquement pour les caractères entre ces deux (inclus) dans l'ordre d'interclassement, ex. [0-9] en ASCII apparie n'importe quel chiffre décimal. Il est illégal pour deux suites de partager un point final, ex. a-c-e. Les étendues sont dépendantes du fusionnement de séquences, et les programmes portables doivent éviter de les relayer.
Pour inclure un ] dans une suite, placez le comme premier caractère (peut être suivi de ^). Pour inclure un -, placez le comme premier ou dernier caractère, ou second point final d'une suite. Pour utiliser un - comme premier point final d'une suite, insérez le dans des [. et .] pour en faire un élément de fusion (voir plus bas). À l'exception de ceux-ci et certaines combinaisons utilisant [ (voir prochains paragraphes), tous les autres caractères spéciaux, incluant \, perdent leur signification spéciale dans une expression entre parenthèses.
Dans une expression entre crochets, un élément d'assemblage (caractère, une suite de caractères multiples qui s'assemble comme un caractère unique ou un nom de séquence d'assemblage) inclu entre [. et .] tient lieu de séquence de caractères de cet élément d'assemblage. La séquence est un élément unique de l'expression entre crochets. Une expression entre crochets contenant un élément d'assemblage à caractère multiple peut ainsi apparier plus d'un caractère, ex. si la séquence d'assemblage inclut un élément d'assemblage ch, alors la RE [[.ch.]]*c apparie les cinq premiers caractères chchcc.
Dans une expression entre crochets, un élément d'assemblage inclu dans [= et =] est une classe d'équivalence, tenant lieu pour les séquences de caractères de tous les éléments d'assemblage équivalents à celui-ci, incluant lui-même. (S'il n'y a pas d'autres éléments d'assemblage équivalents, le le traitement est le même que si les délimiteurs inclus étaient [. et .].) Par exemple, si o et ^ sont membres d'une classe d'équivalence, alors [[=o=]], [[=^=]], et [o^] sont topus synonymes. Une classe d'équivalence peut ne pas être le point final d'une chaîne.
Dans une expression entre crochets, le nom d'une classe caractère incluse dans [: et :] tient lieu pour la liste de tous les caractères de cette classe. Les noms de classe caractère standard sont : alnum, alpha, blank, cntrl, digit, graph, lower, print, punct, space, upper, xdigit. Ils représentent les classes caractère définies dans ctype(3). Une classe caractère peut ne pas être utilisée comme point final d'une chaîne.
Il existe deux cas spéciaux d'expressions entre crochets : les expressions [[:<:]] et [[:>:]] apparient une chaîne null au début et à la fin d'un mot respectivement. Un mot est défini comme une suite de caractères mot ni précédés ni suivis de caractères mot. Un caractère mot est un caractère alnum (comme défini par ctype(3)) ou un souligné. C'est une extension, compatible mais non spécifiée par POSIX 1003.2, et sera utilisée avec précaution pour être portable sur d'autres systèmes.
Dans l'éventualité qu'une RE puisse apparier plus d'une sous-chaîne d'une chaîne donnée, la RE apparie celle démarrant le plus tôt dans la chaîne. Si la RE apparie plus d'une sous-chaîne démarrant à ce point, elle apparie la plus longue. Les sous-expressions apparient aussi les sous-chaînes les plus longues possibles, avec la contrainte que l'appariement complet soit aussi long que possible, avec des sous-expressions démarrant plus tôt dans la RE prenant la priorité sur ceux qui démarrent plus tard. Notez que le plus heut niveau de sous-expressions prend ainsi la priorité sur les composants des sous-expressions de plus bas niveau.
Les longueurs d'appariement sont mesurées en caractères, pas en éléments d'assemblage. Une chaîne null est considérée plus longue que pas d'appariement du tout. Par exemple, bb* apparie les trois caractères du milieu de abbbc, (wee|week)(knights|nights) apparie tous les dix caractères de weeknights, alors que (.*).* est apparié contre abc la sous-expression entre parenthèses apparie tous les tois caractères, et quand (a*)* est apparié contre bc la RE et la sous-expression entre parenthèses apparient toutes les deux la chaîne null.
Si l'appariement insensible à la casse est spécifié, l'effet est plus important que si toutes les distinctions de casse disparaissaient de l'alphabet. Quand un caractère d'alphabet apparaît comme caractère ordinaire à côt" d'une expression entre crochets, il est transformé en une expression entre crochets contenant les deux cas, ex. x devient [xX]. Quand il apparaît dans une expression entre crochets, tousl les cas de sa contrepartie sont ajoutés dans l'expression entre crochets, ainsi (ex.) [x] devient [xX] et [^x] devient [^xX].
Il n'y a pas de longueur particulière pour les RE, sauf aussi loin que la mémoire le permet. L'utilisation de la mémoire est approximativement linéaire en taille de RE, et largement insensible à la complexité des RE, sauf pour les répétitions de bornes. Les répétitions de bornes sont implémentées par des expansions de macros, qui sont coûteuses en temps et en espace. Un genre RE, ((((a{1,100}){1,100}){1,100}){1,100}){1,100} lancera (éventuellement) le processus de swap sur la plupart des machines. [1]
| [1] | Ceci a été écrit en 1994, souvenez vous en. Les chiffres ont probablement changé, mais le problème persiste. |
| <<< Previous | Home | Next >>> |
| Fonctions et opérateurs chaîne binaire | Up | Fonctions de formatage de type |