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: