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 27/01/2021 13:28:17

Leehan
Membre

contrainte de verification combinaison de caractères

PostgreSQL 11.5, W10 server 2012.

Bonjour,

Je souhaite restreindre les valeurs d'un champ à une combinaison de caractères.
Voici un extrait de la liste :

'A', 'AL', 'SL', 'd', 'h', '_g', '_v')

Et donc je souhaite autoriser des valeurs uniquement issues de la combinaison des éléments de cette liste à travers une contrainte CHECK.
Mais comme la liste comporte une petite trentaine de caractères autorisés, je préfère éviter de lister les "ouatmilles" combinaisons possibles du genre

...CHECK (monchamp IN ('A', 'AL_v ','SL_g', 'Ah,...)

Auriez-vous quelques pistes sur ce sujet ?
Merci

Dernière modification par Leehan (27/01/2021 14:27:10)

Hors ligne

#2 27/01/2021 14:22:30

dverite
Membre

Re : contrainte de verification combinaison de caractères

La règle de combinaison c'est bien la concaténation de valeurs, et cette concaténation se faisant dans n'importe quel ordre ou dans le même ordre que la liste?

Hors ligne

#3 27/01/2021 14:26:07

Leehan
Membre

Re : contrainte de verification combinaison de caractères

Disons que la liste comporte trois grands ensembles de caractères : les majuscules, les minuscules et des occurrences avec un _ devant.
Potentiellement, les utilisateurs saisiront au minimum un caractère du premier groupe et au maximum un de chaque groupe - concaténés donc. (normalement car le débat sur le du nombre de caractères n'est pas tout à fait clos).

Je corrige le message initial pour éviter cette confusion.

Dernière modification par Leehan (27/01/2021 14:33:06)

Hors ligne

#4 27/01/2021 18:25:05

jmarsac
Membre

Re : contrainte de verification combinaison de caractères

Bonjour,

Soit vous utilisez des règles exprimables en expressions rationnelles (https://www.postgresql.org/docs/13/func … SIX-REGEXP) ce qui semble être le cas:

 CHECK  (monchamp ~ 'expression')

soit vous devrez énumérer toutes les valeurs possibles

 CHECK  (monchamp IN ('v1', 'v2', 'v3'))

Hors ligne

#5 27/01/2021 20:10:40

dverite
Membre

Re : contrainte de verification combinaison de caractères

Disons que la liste comporte trois grands ensembles de caractères : les majuscules, les minuscules et des occurrences avec un _ devant.

Mais le 'AL' ou 'SL' de la liste en #1 ne sont pas dans ces catégories donc pour ma  part je ne comprends pas la définition exacte du problème.

Hors ligne

#6 28/01/2021 10:25:51

Leehan
Membre

Re : contrainte de verification combinaison de caractères

@jmarsac : énumérer toutes les valeurs possibles revient à en écrire plus de 1000 ! Et en terme de maintenance c'est fastidieux, regenerer la liste des 1000 si des occurrences de la liste changent...
utiliser les expressions regulières ? je vais regarder cela.


@dverite : voilà la liste  des caractères autorisés

 'A', 'AL', 'AS','B','C','D', 'G', 'L', 'LA', 'LS','NO', 'R', 'S', 'SA', 'SL','T', 'TL', 'TS', 'X', 'd', 'h', 'l', 'm', 'p', 'r', 't', '_lab', '_g', '_o', '_p', '_tc', '_v', '_x'

Et donc les valeurs autorisées ne peuvent être qu'une combinaison d'une des 19 premières (les majuscules) avec/ou pas d'une des 7 suivantes avec/ou pas d'une des 7 dernières.
Ce qui donne comme valeurs finales que je souhaite autoriser par exemple : Ad_g ou ALl.
I.e. il faut empêcher que les utilisateurs puissent rentrer d'autres lettres.
J’espère que c'est plus clair.

Merci

Dernière modification par Leehan (28/01/2021 12:53:07)

Hors ligne

#7 28/01/2021 12:00:15

Marc Cousin
Membre

Re : contrainte de verification combinaison de caractères

Alors, une regexp c'est probablement le plus simple. Quelque chose du genre:

CHECK  (monchamp ~ '^(A|AL|AS|B|C|D|G|L|LA|LS|NO|R|S|SA|SL|T|TL|TS|X)(d|h|l|m|p|r|t)?(_lab|_g|_o|_p|_tc|_v|_x)?$')

Là on lui dit qu'on veut le début de chaîne, puis un des 19 premiers éléments, puis facultativement un de la seconde liste, puis facultativement un de la 3e liste, puis la fin de chaîne

Dernière modification par Marc Cousin (28/01/2021 12:00:29)


Marc.

Hors ligne

#8 28/01/2021 12:04:32

Marc Cousin
Membre

Re : contrainte de verification combinaison de caractères

Par contre j'ai un doute sur l'exemple AL_l, avec la liste que vous avez fournie je ne vois pas comment ça matcherait


Marc.

Hors ligne

#9 28/01/2021 12:59:28

Leehan
Membre

Re : contrainte de verification combinaison de caractères

Par contre j'ai un doute sur l'exemple AL_l

Tout à fait, c'est corrigé.
Merci pour le "?", c'est ce que j'étais en train de chercher dans la doc.
Je teste et reviendrai conclure (j'espère).

Dernière modification par Leehan (28/01/2021 13:00:16)

Hors ligne

#10 25/02/2021 14:50:40

Leehan
Membre

Re : contrainte de verification combinaison de caractères

Comme annoncé, je reviens pour un retour d’expérience.
La vérification testée sur un petit jeu de données fonctionne.
Plus qu'à passer en production.
Merci.

Hors ligne

#11 25/02/2021 15:04:50

Marc Cousin
Membre

Re : contrainte de verification combinaison de caractères

impeccable. on est en plein dans le cas où les regexp excellent, il faut dire smile


Marc.

Hors ligne

Pied de page des forums