Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
#1 05/04/2012 15:03:12
- NicoFromIGN
- Membre
CHECK : Correspondance de motif d'une chaîne contenant un underscore
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
#2 05/04/2012 15:07:13
- edlm
- Membre
Re : CHECK : Correspondance de motif d'une chaîne contenant un underscore
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
#3 05/04/2012 15:14:26
- NicoFromIGN
- Membre
Re : CHECK : Correspondance de motif d'une chaîne contenant un underscore
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
#4 05/04/2012 15:25:16
- gleu
- Administrateur
Re : CHECK : Correspondance de motif d'une chaîne contenant un underscore
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
#5 05/04/2012 16:33:27
- NicoFromIGN
- Membre
Re : CHECK : Correspondance de motif d'une chaîne contenant un underscore
Très bon à savoir! Merci encore
Hors ligne
#6 09/04/2012 15:54:25
- SQLpro
- Membre
Re : CHECK : Correspondance de motif d'une chaîne contenant un underscore
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
#7 13/04/2012 10:04:56
- NicoFromIGN
- Membre
Re : CHECK : Correspondance de motif d'une chaîne contenant un underscore
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