我在互联网上发现的一些文章比较了ISNULL和COALESCE,所以我认为我的问题有点不同。
我想知道哪个在性能方面更好?
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
或者
SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';
除了表现之外,在决定时我还应该考虑其他问题吗?
编辑:
我正在使用Teradata。
答案 0 :(得分:7)
此版本稍微强一些,允许(可能)使用索引
SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';
可以简化为
SELECT * FROM mytable WHERE mycolumn <> '';
我之所以说“轻微”和“可能”的原因是非等同谓词可能意味着你最终还是会进行全面扫描。
答案 1 :(得分:1)
您也可以考虑使用ANSI_NULL ON setting。这将隐式过滤掉您发出搜索参数的列上的空值。这样做简化了您的查询,我不确定它是否更快。理论上应该理论上应该这样,因为需要评估较少的过滤器参数,并且在where子句中不使用任何函数来启用全索引选择性。作为示例,您可以像这样重新考虑您的查询:
SET ANSI_NULLS ON;
SELECT * FROM mytable WHERE NOT mycolumn = '';
我希望这会有所帮助。