SQL NVL equivalente - sem declarações de if/case & isNull & Coalesce
Pergunta
Existem funções equivalentes nvl () no SQL?
Ou algo próximo o suficiente para ser usado da mesma maneira em certos cenários?
ATUALIZAR:
Não, declarações se
Sem declarações de caso
Não é ISNULL
Sem coalesce
select nvl (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;
(expression)
SODIUFOSDIUFSDOIFUDSF
1 row(s) retrieved.
select isnull (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;
674: Routine (isnull) can not be resolved.
Error in line 1
Near character position 8
select coalesce (purge_date,"SODIUFOSDIUFSDOIFUDSF") from id_rec where id=36581;
674: Routine (coalesce) can not be resolved.
Error in line 1
Near character position 8
select decode(purge_date, NULL, "01/01/2009", purge_date) from id_rec where id=74115;
800: Corresponding types must be compatible in CASE expression.
Error in line 1
Near character position 57
Solução
Você parece estar usando o Informix.
Afaik, há decodificação lá:
DECODE(field, NULL, 'it is null, man', field)
deve lhe dar o mesmo resultado que NVL(field, 'it is null, man')
Por favor, poste o nome e a versão exatos do RDBMS que você está usando.
Outras dicas
SQL Server: IsNull ou Coalescehttp://msdn.microsoft.com/en-us/library/ms184325.aspx
Sybase: Função ISNULLhttp://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.blocks/html/blocks/blocks162.htm
PostGres: Eu não consegui encontrar um, embora não tenha verificado totalmente. Sugere selecionar onde é nulo e construir a partir daquihttp://archives.postgresql.org/pgsql-sql/1998-06/msg00142.php
DB2 - Coalescehttp://publib.boulder.ibm.com/infocenter/db2luw/v8/index.jsp?topic=/com.ibm.db2.udb.doc/admin/r0000780.htm
O problema com a sua instrução Decode que está gerando o erro 800 é simples. '01/01/2009'
está sendo tratado como uma string e é na verdade o quarto argumento que gera o erro.
Aprecie que a entrada e a saída de uma instrução Decode possam ser diferentes tipos de dados, para que o mecanismo exige que você seja mais explícito neste caso. (Você quer purge_date
fundido como uma corda ou a corda '01/01/2009'
, ou o argumento da string analisou como uma data ou a data original? Não há como o motor saber.
Experimente isso:
SELECT DECODE(purge_date, NULL, '01/01/2009'::DATE, purge_date)
Você também pode escrever esse terceiro argumento como:
DATE('01/01/2009')
MDY(1,1,2009)
dependendo da versão e preferência pessoal.