Oracle
 sql >> Base de données >  >> RDS >> Oracle

Fonction NANVL() dans Oracle

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: