gpt4 book ai didi

sql - NOT 条件排除 NULL 值

转载 作者:行者123 更新时间:2023-12-05 02:59:39 29 4
gpt4 key购买 nike

我有以下示例数据。

此查询返回我需要的数据:

select * from #temp
where (Field1 = 'Test1' or Field1 = 'Test10') and
Field2 = 'Test2' and
(Field3 = 'Test3' or Field3 = 'Test30')

但是,我需要另一个查询,基本上显示不满足上述条件的记录(异常查询)。

如果我使用以下查询,它不会显示 NULL 值。这是为什么?我如何才能显示具有 NULL 值的行?

select * from #temp
where NOT (Field1 = 'Test1' or Field1 = 'Test10') and NOT
Field2 = 'Test2' and NOT
(Field3 = 'Test3' or Field3 = 'Test30')

Create Table #temp
(
ID int,
Field1 varchar(50),
Field2 varchar(50),
Field3 varchar(50)
)

Insert into #temp
(
ID,
Field1,
Field2,
Field3
)
select
1,
'Test1',
'Test2',
'Test3'
union all
select
2,
NULL,
NULL,
NULL
union all
select
3,
'Test',
'Test',
'Test'

最佳答案

几乎所有与 NULL 的比较都会返回 NULL,这被视为 false。

一个相当昂贵的方法是使用EXCEPT:

select t.*
from #temp t
except
select t.*
from #temp t
where (Field1 = 'Test1' or Field1 = 'Test10') and
Field2 = 'Test2' and
(Field3 = 'Test3' or Field3 = 'Test30');

请注意,这会消除重复的行。

我会将条款简化为:

where Field1 in ('Test1', 'Test10') and
Field2 = 'Test2' and
Field3 in ('Test3', 'Test30');

显然,您可以重构 where 子句以将 null 值考虑在内。那真的很麻烦而且容易出错。因此,另一种方法是创建一个标志并仅使用该标志:

select t.*
from #temp t cross apply
(values (case when (Field1 = 'Test1' or Field1 = 'Test10') and
Field2 = 'Test2' and
(Field3 = 'Test3' or Field3 = 'Test30')
then 1 else 0
end)
) v(flag)

然后:

 where v.flag = 1   -- for inclusion
where v.flag = 0 -- for exclusion

关于sql - NOT 条件排除 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57708795/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com