Expression régulière sous oracle, pl / sql [Résolu/Fermé]

Signaler
Messages postés
151
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
9 juillet 2020
-
Messages postés
151
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
9 juillet 2020
-
Bonjour

je veux faire une condition sur une sélection de mes données, je veux sélectionner les données qui respectent les contraintes suivantes:



- Uniquement des caractères suivants : [a .. z] + [A .. Z] + [0 .. 9] +[ _ ]

- Avec les restrictions suivantes :

•ne pas dépasser 128 caractères
•ne doit pas commencer par un chiffre
•ne peut avoir plusieurs caractères "blanc souligné" de suite
•le nom ne doit pas être un mot réservé de SQL

=> Autrement dit, les lettres accentuées (é à ù ï É ...), les "kanas" (ç œ ...), les caractères de ponctuation (, ; : ! ? ...) et autres caractères spéciaux, comme le blanc, sont proscrits.


j'ai commencé à le faire :


REGEXP_LIKE (COL_NOM_SQL, '^([a-z]*|[ _ ]' ...);


et après je me bloque !

si quelqu’un peut m'aider ou me filer un lien pour traduire mon texte en expression je serai reconnaissante

Je vous remercie

1 réponse

Messages postés
3669
Date d'inscription
jeudi 16 juin 2005
Statut
Membre
Dernière intervention
25 janvier 2021
982
Bonjour,

En une seule expression rationnelle, ça peut être un peu compliqué, et pas facile à maintenir.
Par contre, comme si je l'imagine, tu es dans une clause WHERE, tu peux faire plusieurs expressions reliées par des AND. Cela pourrait avoir un coût en termes de performances, à toi de voir si c'est rédhibitoire.
L'avantage également, c'est de pouvoir utiliser NOT, pour les restrictions.

En décomposant dans le même ordre que tes points :
WHERE REGEXP_LIKE (COL_NOM_SQL, '^[a-zA-Z0-9_]*$')
    AND NOT REGEXP_LIKE (COL_NOM_SQL, '.{129}')
    AND NOT REGEXP_LIKE (COL_NOM_SQL, '^[0-9]')
    AND COL_NOM_SQL NOT LIKE  '%__%'
    AND COL_NOM_SQL NOT IN ('SELECT', 'WHERE')...

Pour la taille max, il y a sûrement une fonction plus simple que par expression rationnelle.
Pour les mots réservés SQL, je ne sais pas s'il y a une liste directement accessible en PL/SQL, et il faudrait aussi tester en passant la colonne en majuscules pour se départir des différences de casse.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
151
Date d'inscription
mercredi 20 avril 2016
Statut
Membre
Dernière intervention
9 juillet 2020
3
Bonjour Reivax et merci pour ta réponse ,

exactement je suis dans le WHERE , et j'ai fais plusieurs conditions sur 3 lignes , dans une seule regx ce n'est pas evident ! donc voici ce que j'ai fais

 
[du code ]
where [...]

AND NOT EXISTS (SELECT 1 FROM V$RESERVED_WORDS WHERE COL_NOM_SQL = KEYWORD) -- ca c pour les mot reservés au SQL ca marche !

AND REGEXP_LIKE COL_NOM_SQL , '^[A-z_][A-z0-9_]{1,128}'))  -- ca c est pour qu'il commence par une lettreou '_'  et pas un nombre ou autre chose et ca marche aussi

AND COL_NOM_SQL NOT LIKE  '%__%'  --  => mais ca en fait je ne suis pas sure car il va accepté le mot suivant : 'TOTO____TOTO'  quiest interdit : ( ne peut avoir plusieurs caractères 'blanc souligné' de suite)
...



Merci encore :)