这在语义上与以下内容相同:
And IH.CustomerItemNumber <> '' And IH.CustomerItemNumber Is Not Null
因此,它正在检查该列是否既不是空的,也不是空字符串。可能很重要。
更新
在这种情况下,因为我们正在寻找字符串文字(空字符串)的不相等性,所以您至少有三个语义正确的选项:
And IH.CustomerItemNumber <> ''
And IH.CustomerItemNumber <> '' And IH.CustomerItemNumber Is Not Null
And isnull(IH.CustomerItemNumber, '') <> ''
第一个将返回与其他两个相同的结果集,因为无论ansi_nulls设置<> ''
如何,都不会匹配空值。
在开发系统的快速测试中,第一个和第二个都使用了索引查找。在几个非常简化的测试之一中,第一个比第二个稍微好一点。
第三个,因为它添加了一个函数调用,可能不像其他的那样使用索引,所以这可能是最糟糕的选择。也就是说,在快速测试中,isnull 能够使用索引扫描。进一步添加Is Not Null
到第三个选项实际上加快了它的速度并将其移至索引搜索。去图(GO!GO!查询优化器!)。
与@Gordon 一样,我大多数时候也会选择第二个选项,因为它可以更好地向其他开发人员(或我自己)说明我的意图,并且如果我们要检查另一个可能为空的列是否相等(想想潜在的 ansi_nulls 关闭)。
为了完整起见:
And nullif(IH.CustomerItemNumber, '') is not null
And case when IH.CustomerItemNumber = '' then null else IH.CustomerItemNumber end is not null
And case IH.CustomerItemNumber when '' then null else IH.CustomerItemNumber end is not null
在 SQL Server 中都以完全相同的方式解释(据我所知),并且执行与上面的第三个选项相同。