Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Função NANVL() no Oracle


No Oracle, o NANVL() função nos permite lidar com NaN valores especificando outro número para retornar em seu lugar.

A forma como funciona é que aceita dois argumentos. Se o primeiro argumento for NaN (não um número), ele retorna o segundo argumento. Se o primeiro argumento for um número, então ele simplesmente retorna esse número.

Observe que esta função é útil apenas para números de ponto flutuante do tipo BINARY_FLOAT ou BINARY_DOUBLE .

Sintaxe


A sintaxe fica assim:
NANVL(n2, n1)

Cada argumento pode ser qualquer tipo de dados numérico ou qualquer tipo de dados não numérico que possa ser convertido implicitamente em um tipo de dados numérico.

Exemplo


Podemos produzir NaN dividindo um valor zero float/double por zero:
SELECT 0f/0 
FROM DUAL;

Resultado:
   0F/0 
_______ 
NaN     

Mas se não quisermos NaN a ser retornado, podemos usar o NANVL() função para retornar um valor diferente:
SELECT NANVL(0f/0, 0) 
FROM DUAL;

Resultado:
   NANVL(0F/0,0) 
________________ 
0.0             

Aqui está novamente, mas desta vez especificamos um valor diferente para retornar no lugar de NaN :
SELECT NANVL(0f/0, 123) 
FROM DUAL;

Resultado:
   NANVL(0F/0,123) 
__________________ 
123.0              

NaN Literal de ponto flutuante


O Oracle também fornece alguns literais de ponto flutuante para situações que não podem ser expressas como um literal numérico. Estes incluem binary_float_nan que representa um valor do tipo BINARY_FLOAT para a qual a condição IS NAN é verdadeiro e binary_double_nan , que representa um valor do tipo BINARY_DOUBLE para a qual a condição IS NAN é verdade.

Aqui está um exemplo de uso desses literais de ponto flutuante:
SELECT 
    NANVL(binary_double_nan, 0), 
    NANVL(binary_float_nan, 0)
FROM DUAL;

Resultado:
   NANVL(BINARY_DOUBLE_NAN,0)    NANVL(BINARY_FLOAT_NAN,0) 
_____________________________ ____________________________ 
0.0                           0.0                         

Passando um número


Como mencionado, se o primeiro argumento for um número, ele retornará esse número:
SELECT NANVL(33, 0) 
FROM DUAL;

Resultado:
   NANVL(33,0) 
______________ 
            33 

Argumentos não numéricos


Os argumentos podem ser qualquer tipo de dados numérico ou qualquer tipo de dados não numérico que possa ser convertido implicitamente em um tipo de dados numérico.

Aqui está um exemplo do que acontece quando os argumentos não satisfazem esse critério:
SELECT NANVL('Gosh', 'Dang')
FROM DUAL;

Resultado:
Error starting at line : 1 in command -
SELECT NANVL('Gosh', 'Dang')
FROM DUAL
Error report -
ORA-01722: invalid number

Argumentos nulos


NANVL() retorna null se algum argumento for null :
SET NULL 'null';

SELECT 
    NANVL(null, 16),
    NANVL(1024, null),
    NANVL(null, null)
FROM DUAL;

Resultado:
   NANVL(NULL,16)    NANVL(1024,NULL)    NANVL(NULL,NULL) 
_________________ ___________________ ___________________ 
             null                null                null 

Por padrão, SQLcl e SQL*Plus retornam um espaço em branco sempre que um valor nulo ocorre como resultado de um SQL SELECT demonstração.

No entanto, você pode usar SET NULL para especificar uma string diferente a ser retornada. Aqui eu especifiquei que a string null deve ser devolvido.

Argumentos ausentes


Chamando NANVL() sem nenhum argumento resulta em um erro:
SELECT NANVL()
FROM DUAL;

Resultado:
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:

E a mesma coisa se aplica ao chamá-lo com muitos argumentos:
SELECT NANVL(10, 2, 3)
FROM DUAL;

Resultado:
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: