CHECK CONSTRAINT de la chaîne pour ne contenir que des chiffres. (Oracle SQL)
J'ai une colonne, dire PROD_NUM qui contient un numéro qui est à gauche, des zéros. Par exemple 001004569. Ils sont tous neuf caractères.
Je ne pas utiliser un type numérique parce que le fonctionnement normal sur les nombres ne font pas sens, sur ces "numéros" (Par exemple PROD_NUM * 2 n'a aucun sens.) Et puisqu'ils sont tous de la même longueur, la colonne est définie comme un CHAR(9)
CREATE TABLE PRODUCT (
PROD_NUM CHAR(9) NOT NULL
-- ETC.
)
Je voudrais limiter PROD_NUM de sorte qu'il ne peut contenir qu'un nombre de neuf chiffres. Pas d'espaces, pas d'autres personnages en plus de '0' à '9'
source d'informationauteur Shannon Severance
Vous devez vous connecter pour publier un commentaire.
Vous déjà reçu quelques belles réponses sur la façon de continuer sur votre chemin. Permettez-moi de suggérer un chemin différent: l'utilisation d'un nombre(9,0) type de données à la place.
Raisons:
Vous n'avez pas besoin d'un supplément de contrainte de vérification afin de confirmer qu'il contient un nombre réel.
Vous n'êtes pas tromper l'optimiseur. Par exemple, combien de prod_num sont "ENTRE" 000000009 " et "000000010'"? Beaucoup de chaînes de caractères tenir. Alors que le "prod_num entre le 9 et le 10" de toute évidence ne sélectionne que deux numéros. Les cardinalités sera mieux, conduisant à de meilleurs plans d'exécution.
Vous n'êtes pas tromper les futurs collègues qui ont à maintenir votre code. En le nommant "prod_num" sera automatiquement supposer qu'il contient un certain nombre.
Votre application peut utiliser lpad(to_char(prod_num),9,'0'), de préférence exposés dans une vue.
Ce qui concerne,
Rob.
(mise à jour par MH) Le fil de commentaires a une discussion qui illustre joliment les différentes choses à considérer au sujet de cette approche. Si ce sujet est intéressant que vous devez lire.
Fonctionne dans toutes les versions:
Je pense que Codebender de regexp va du bon travail, mais je soupçonne que c'est un peu lent.
Que vous pouvez faire (non testé)
remplacer(translate(prod_num,'0123456789','NNNNNNNNNN'),'N',null) null
Convertir en entier, de le jeter en arrière pour varchar, et de vérifier qu'elle est égale à la chaîne d'origine?
En MSSQL, je pourrais utiliser quelque chose comme ce que la contrainte de test:
Je ne suis pas un Oracle personne, mais je ne pense pas qu'ils soutiennent entre crochets les listes de caractères.
dans MS SQL server-je utiliser cette commande:
alter table add constraint [cc_mytable_myfield] (cast(myfield comme bigint) > 0)
Ne savez pas sur les performances, mais si vous connaissez la plage, le travail.
Utilise une contrainte de VÉRIFICATION au moment de la création de la DDL.
comme
cela fonctionnera également