Vous n'êtes pas identifié(e).
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
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?
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
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
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
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.
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
@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
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
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
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
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
impeccable. on est en plein dans le cas où les regexp excellent, il faut dire
Marc.
Hors ligne