Vous n'êtes pas identifié(e).
Bonjour,
Je souhaiterais mettre une contrainte sur un attribut de type character varying pour qu'il corresponde à mon motif.
Typiquement ma chaîne devra ressembler à 'toto_titi' où la présence de l'underscore est obligatoire.
Problème : l'underscore est utilisé dans Postgresql pour remplacer n'importe quel caractère lors de la définition du motif!
Connaitriez-vous une solution pour palier ce problème? (je n'ai pas l'impression que l'on puisse remplacer l'underscore par son code ascii dans le motif).
Merci et bonne journée
Hors ligne
Bonjour,
Typiquement ma chaîne devra ressembler à 'toto_titi' où la présence de l'underscore est obligatoire.
Problème : l'underscore est utilisé dans Postgresql pour remplacer n'importe quel caractère lors de la définition du motif!
Utilisez le caractère d'échappement. Voir la documentation.
Éric
Hors ligne
Merci beaucoup j'étais passé 3 fois devant l'info sans la lire.
Je pars m'acheter des lunettes. A+
J'utiliserai donc \_ (antislash avant l'underscore).
Hors ligne
Attention si vous utilisez un antislash dans une chaîne de bien mettre le E devant la chaîne, du style : E'toto\_titi'... sinon vous aurez des avertissements dans vos logs avant la 9.1 et directement une erreur en 9.1.
Guillaume.
Hors ligne
Très bon à savoir! Merci encore
Hors ligne
PostGreSQL ayant un opérateur LIKE conforme à la norme, il suffit d'utiliser le mot clef ESCAPE dans le LIKE pour ce faire, en évitant d'utiliser un caractères d'échappement qui à déjà une signification par ailleurs.
Exemple : LIKE '_%§_%_' ESCAPE '§'
Les, caractères rarements employés et disponible au clavier sont :
$ $ µ § } ] ^ ` [ {
A +
Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES, Expert langage SQL
Le site sur les SGBD relationnel et langage SQL : http://sqlpro.developpez.com/
Modélisation de données, conseil, expertise, audit, optimisation, tuning, formation
* * * * * Enseignant CNAM PACA, ISEN Toulon, CESI Aix en Provence * * * * *
Hors ligne
Merci. Ma solution finale pour info :
*
add check (nom SIMILAR TO '(0|1)[0-9](1|3|5|7|9)$_(0|1)[0-9](0|2|4|6|8)%' ESCAPE'$');
*
Je vérifie que mon attribut 'nom' possède un formalisme tel que :
- (0|1) : le premier caractère peut être '0' ou '1'
- [0-9] : le second caractère est un chiffre
- (1|3|5|7|9) : le troisième caractère est un chiffre impaire
- $_ : le quatrième caractère est obligatoirement un underscore. C'est ici le symbole '$' que j'ai choisi comme caractère d'échappement, chose que j'indique au traitement grâce à l'ajout de ESCAPE'$' à la suite du SIMILAR TO '...'
- (0|1) : le cinquième caractère peut être '0' ou '1'
- [0-9] : le sixième caractère est un chiffre
- (0|2|4|6|8) : le septième est un chiffre paire
- % : on peut ensuite trouver tout ce qu'on veut tant que ce qu'il y a avant convient.
Hors ligne