2009-07-22 4 views
1

Dans Oracle, est-il possible de faire correspondre à la fois un format de chaîne particulier et une chaîne vide en utilisant une seule regex?Possibilité de créer une expression régulière Oracle capable de correspondre à NULL?

Quelque chose le long des lignes de:

SELECT 1 
    FROM DUAL 
WHERE REGEXP_LIKE('12345', '^([1-5]{5})|NULL$'); 

SELECT 1 
    FROM DUAL 
WHERE REGEXP_LIKE('', '^([1-5]{5})|NULL$'); 

SELECT 1 
    FROM DUAL 
WHERE REGEXP_LIKE(NULL, '^([1-5]{5})|NULL$'); 

où la partie « NULL » du regex est traitée comme une classe de caractères plutôt qu'une chaîne littérale et les trois requêtes renvoient 1.

I » m écrivant des routines de validation de données et souhaitant stocker/utiliser une seule regex pour déterminer à la fois le format et si la chaîne d'entrée peut être vide - plutôt que de spécifier ces règles de validation séparément pour chaque élément de données.

Merci, Jeff

Répondre

6

Je ne pense pas que vous pouvez le faire directement, mais vous pouvez utiliser nvl pour faire des valeurs nulles apparaissent sous la forme d'une chaîne vide ou la chaîne 'NULL'.

SELECT 1 
    FROM DUAL 
WHERE REGEXP_LIKE(NVL(value, 'NULL'), '^([1-5]{5})|NULL$'); 
+0

C'est une bonne solution. Merci! – jlpp

5

Une option: Utiliser

where rexp_like(expr, ''') or (expr is null) 
+0

+1, cette solution ne repose pas sur des valeurs magiques ... une fois que la syntaxe a été corrigée ... REGEXP_LIKE (expr, «^([1-5] {5}) $) –

+0

ironique ... ma syntaxe de correction a introduit une erreur de syntaxe ... :( –

+0

Eh bien, je cherchais vraiment une seule expression rationnelle plutôt qu'un prédicat supplémentaire.Codebender a une solution qui répond à ce critère – jlpp

Questions connexes