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: