我只想处理具有至少一个带有值的字段的行。
带有像这样的表
create table #Temp
(
Id int,
cnt1 int,
cnt2 int,
cnt3 int,
cnt4 int,
cnt5 int
)
以下两个查询中哪个查询更快?
select
*
from
#Temp
where
(cnt1 is not null or cnt2 is not null or cnt3 is not null or cnt4 is not null or cnt5 is not null)
或
select
*
from
#Temp
where
isnull(cnt1,0) + isnull(cnt2,0) + isnull(cnt3,0) + isnull(cnt4,0) + isnull(cnt5,0) != 0
我不希望所有字段都等于零的结果,所以第二个查询对我来说不是问题。
此外,是否有更好的方法(更易于阅读)来进行任一查询?
答案 0 :(得分:2)
我认为不会有一个真正的“好”查询。无论您做什么,它仍然等于一系列OR
条件,并且很少能很好地运行。我建议这样做:
select
*
from
#Temp
where coalesce(cnt1, cnt2, cnt3, cnt4, cnt5) is not null
但是您应该使用实际数据,资源,索引和负载在数据库上尝试,并查看哪种方法最有效。
答案 1 :(得分:2)
第一个查询可查询,第二个查询不可。
这意味着如果SQL Server可以使用任何索引来优化查询,它可以将它们与第一个问题一起使用,但不能与第二个问题一起使用,在这种情况下,第一个问题会更快
没有相关索引,您应该race your horses(如蒂姆在其评论中所写)。