Eu tenho a seguinte consulta onde procuro linhas que não sejam iguais a 1 para a coluna istrue
. No entanto, os resultados incluem apenas registros com 0 e omitem aqueles com nulo. Embora eu esteja ciente de que usar (istrue! = 1 ou istrue is null) produziria o resultado esperado, estou curioso sobre o mecanismo subjacente que faz com que o SQL Server exclua valores nulos. Você poderia fornecer informações sobre esse comportamento? Obrigado!
create table #test
(
id int,
val varchar(100),
istrue bit
)
insert into #test values
(1, 'test-1', 1),
(2, 'test-2', 0),
(3, 'test-3', 1),
(4, 'test-4', 0),
(5, 'test-5', null),
(6, 'test-6', null)
select * from #test
where istrue != 1
drop table if exists #test
Considere verificar a documentação :
Se você considerar que o valor de
istrue
é desconhecido noNULL
caso, então ele pode ou não ser igual1
.A expressão
istrue != 1
então é avaliada comounknown
SQL retorna apenas linhas onde a
WHERE
cláusula é avaliada comotrue
.Se você estiver no SQL Server 2022+, poderá usar
Para dar a semântica da desigualdade que você deseja ( Fiddle ).
O SQL Server não retorna NULLs ao usar o operador diferente (<>) ou o operador de desigualdade (!=) porque NULL não é um valor que pode ser comparado com outros valores.
NULL significa valor desconhecido ou ausente, portanto, qualquer comparação com NULL resulta em valor desconhecido ou falso
Portanto, se quiser incluir NULLs nos resultados da sua consulta, você precisará usar o predicado IS NULL além do operador diferente
Além do que já foi dito, esta não é apenas uma implementação do SQL Server, mas segue o padrão ANSI, portanto, outros sistemas de banco de dados têm comportamento semelhante.
Se você tiver um caso de uso em que realmente deseja tratar
NULL
os valores da mesma forma E um dosNULL
valores for uma variável ou literal, uma coisa que você pode fazer é desligar aANSI_NULL
lógica antes de executar sua consulta:Isso se aplicará no nível da sessão. Aqui está um exemplo do dbfiddle.uk .
Mas, infelizmente, isso não ajuda no seu caso de exemplo, já que você está tentando comparar onde está uma coluna
NULL
com um literal não nulo.No seu caso, você teria que verificar explicitamente
IS NULL
a coluna, como mencionou, ou pode usar uma função paraISNULL()
agrupar a coluna e fornecer um valor de substituição que faça sentido. Por exemplo:ISNULL(istrue, 0) != 1