Existem muitas explicações de por que NOT IN NULL não funciona, mas não vi nenhuma solução. (pergunta recente aqui: Por que NOT IN com um conjunto contendo NULL sempre retorna FALSE/NULL? )
Eu tenho 6 argumentos opcionais para um procedimento armazenado que são usados para filtrar um determinado valor de uma consulta. O desenvolvedor anterior fez algo assim:
IF @var1 IS NULL AND .....
select ...
else
select ...
where value in (@var1, ...)
Eu particularmente não gostei disso. (A consulta é bastante massiva), então decidi optar por algo assim:
(Tivemos os resultados em uma tabela temporária de qualquer maneira)
IF @var IS NOT NULL OR ...
delete from #temp where value not in (@var1,...)
Mas percebi que isso não vai funcionar.
A única coisa que posso pensar em fazer é criar outra tabela temporária que conterá apenas os valores não nulos em @ var1, etc. (usando instruções if ou excluindo where is NULL) e, em seguida, fazendo uma exclusão de junção nesta tabela.
Existe uma maneira melhor?
Não sei sobre o Sybase, mas no SQL Server você pode fazer assim.
Se você não pode usar
values
para criar uma tabela derivada, você pode usarunion all
.Isso deve funcionar da mesma forma.
O que você já inventou sozinho:
Ou
Ajuste o
ISNULL(@val,'whatever_really_not_exists')
.Para entender
NULLs
melhor recomendo a leitura da documentação do Sybase sobreou um bom artigo de Robert Vollman sobre
NULLs
.