为了找到特定列具有null
值的行,我的一位同事通过使数据为空null
来验证列中的数据是否为null
:
IF (SELECT * FROM [table] WHERE ISNULL([column], '')) = ''
但是我从Stack Overflow(example 1和example 2)的多个示例中了解到,这种形式更为常见:
IF EXIST (SELECT [column] FROM [table])
通过尝试使我们的代码更高效,并尝试采用类似的编码行为/标准,我们遇到了这种审讯。
我希望第二种方式更高效,因为它不会调用函数,但我远不是SQL的专家。
答案 0 :(得分:2)
哪一个更高效? - 通过分析来衡量它。
哪一种更好的做法? - 这取决于。
IF (SELECT * FROM [table] WHERE ISNULL([column], '')) = ''
将缺少的数据与空字符串完全相同,而IF EXIST (SELECT [column] FROM [table])
将它们视为不同。
所以这取决于data
是否可以合法地成为空字符串。如果它不能,那么前者就可以了,如果可以的话,那就是后者。
答案 1 :(得分:2)
在尝试查找特定列具有
null
值的行时,如果{{1}null
,我的同事会通过将数据设为空来验证列中的数据是否为null
}:
...WHERE ISNULL([column], '') = ''
无论可以找到任何其他效率,使用ISNULL()
似乎有点愚蠢,而这种情况很容易被表达为:
WHERE [column] IS NULL
现在,如果您需要测试以查看“至少1”行是否符合特定条件,那么使用EXISTS
几乎总是(甚至可能总是)比不使用{更有效{1}}因为EXISTS
运算符设计为在找到第一行时退出。如果没有返回任何行,那么两个方法可能都是等价的,但如果至少存在一行,那么EXISTS
肯定会更好,因为它不会处理任何其他结果行,因为答案已经在逻辑上确定为EXISTS
。当有许多行满足过滤条件时,效率会更明显。
因此,进行此特定测试的最有效方法是:
true
所以是的,尝试始终使用IF (EXISTS(SELECT * FROM [Table] WHERE [Column] IS NULL))
BEGIN
...
END;
(尽可能)。请阅读EXISTS运营商的MSDN页面,因为它有关于在EXISTS
条款中使用它的其他信息。
有关如何测试效率的信息,请参阅您在DBA.StackExchange上发布的相关问题: