Dans Oracle, le NANVL()
la fonction nous permet de traiter NaN
valeurs en spécifiant un autre nombre à retourner à sa place.
La façon dont cela fonctionne est qu'il accepte deux arguments. Si le premier argument est NaN
(pas un nombre), il renvoie le deuxième argument. Si le premier argument est un nombre, puis il renvoie simplement ce nombre.
Notez que cette fonction n'est utile que pour les nombres à virgule flottante de type BINARY_FLOAT
ou BINARY_DOUBLE
.
Syntaxe
La syntaxe ressemble à ceci :
NANVL(n2, n1)
Chaque argument peut être n'importe quel type de données numérique ou n'importe quel type de données non numérique qui peut être implicitement converti en un type de données numérique.
Exemple
Nous pouvons produire NaN
en divisant une valeur flottante/double nulle par zéro :
SELECT 0f/0
FROM DUAL;
Résultat :
0F/0 _______ NaN
Mais si nous ne voulons pas NaN
à retourner, on peut utiliser le NANVL()
fonction pour renvoyer une valeur différente :
SELECT NANVL(0f/0, 0)
FROM DUAL;
Résultat :
NANVL(0F/0,0) ________________ 0.0
Le voici à nouveau, mais cette fois nous spécifions une valeur différente à renvoyer à la place de NaN
:
SELECT NANVL(0f/0, 123)
FROM DUAL;
Résultat :
NANVL(0F/0,123) __________________ 123.0
NaN
Littéral à virgule flottante
Oracle fournit également des littéraux à virgule flottante pour les situations qui ne peuvent pas être exprimées sous forme de littéral numérique. Ceux-ci incluent binary_float_nan
qui représente une valeur de type BINARY_FLOAT
pour lequel la condition IS
NAN
est vrai, et binary_double_nan
, qui représente une valeur de type BINARY_DOUBLE
pour lequel la condition IS
NAN
est vrai.
Voici un exemple d'utilisation de ces littéraux à virgule flottante :
SELECT
NANVL(binary_double_nan, 0),
NANVL(binary_float_nan, 0)
FROM DUAL;
Résultat :
NANVL(BINARY_DOUBLE_NAN,0) NANVL(BINARY_FLOAT_NAN,0) _____________________________ ____________________________ 0.0 0.0
Passer un numéro
Comme mentionné, si le premier argument est un nombre, alors il renvoie ce nombre :
SELECT NANVL(33, 0)
FROM DUAL;
Résultat :
NANVL(33,0) ______________ 33
Arguments non numériques
Les arguments peuvent être n'importe quel type de données numérique ou n'importe quel type de données non numérique qui peut être implicitement converti en un type de données numérique.
Voici un exemple de ce qui se passe lorsque les arguments ne satisfont pas à ce critère :
SELECT NANVL('Gosh', 'Dang')
FROM DUAL;
Résultat :
Error starting at line : 1 in command - SELECT NANVL('Gosh', 'Dang') FROM DUAL Error report - ORA-01722: invalid number
Arguments nuls
NANVL()
renvoie null
si un argument est null
:
SET NULL 'null';
SELECT
NANVL(null, 16),
NANVL(1024, null),
NANVL(null, null)
FROM DUAL;
Résultat :
NANVL(NULL,16) NANVL(1024,NULL) NANVL(NULL,NULL) _________________ ___________________ ___________________ null null null
Par défaut, SQLcl et SQL*Plus renvoient un espace vide chaque fois qu'une valeur nulle se produit à la suite d'un SQL SELECT
déclaration.
Cependant, vous pouvez utiliser SET NULL
pour spécifier une autre chaîne à renvoyer. Ici, j'ai précisé que la chaîne null
doit être retourné.
Arguments manquants
Appel de NANVL()
sans aucun argument génère une erreur :
SELECT NANVL()
FROM DUAL;
Résultat :
Error starting at line : 1 in command - SELECT NANVL() FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00909: invalid number of arguments 00909. 00000 - "invalid number of arguments" *Cause: *Action:
Et la même chose s'applique lorsque vous l'appelez avec trop d'arguments :
SELECT NANVL(10, 2, 3)
FROM DUAL;
Résultat :
Error starting at line : 1 in command - SELECT NANVL(10, 2, 3) FROM DUAL Error at Command Line : 1 Column : 8 Error report - SQL Error: ORA-00909: invalid number of arguments 00909. 00000 - "invalid number of arguments" *Cause: *Action: