PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#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

NicoFromIGN a écrit :

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

Pied de page des forums