6

我在互联网上找到的一些文章将 ISNULL 与 COALESCE 进行了比较,所以我认为我的问题有点不同。

我想知道哪个在性能方面更好?

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';

或者

SELECT * FROM mytable WHERE COALESCE(mycolumn,'') <> '';

除了性能,在决定时我还应该考虑其他问题吗?

编辑:

我正在使用 Teradata。

4

2 回答 2

7

这个版本更易于分析,并允许(可能)使用索引

SELECT * FROM mytable WHERE mycolumn IS NOT NULL AND mycolumn <> '';

它可以简化为

SELECT * FROM mytable WHERE mycolumn <> '';

我说“稍微”和“可能”的原因是不等式谓词很可能意味着无论如何您最终都会进行完整扫描。

于 2010-10-14T16:31:39.770 回答
1

您也可以考虑使用ANSI_NULL ON 设置。这将隐式过滤掉您发出搜索参数的列上的空值。这样做可以简化您的查询,我不确定它是否会使其更快。但从逻辑上讲,它应该是这样,因为需要评估的过滤器参数更少,并且在 where 子句中没有使用任何函数,这应该启用完整的索引选择性。例如,您可以像这样重构您的查询:

SET ANSI_NULLS ON;
SELECT * FROM mytable WHERE NOT mycolumn = '';

我希望这有帮助。

于 2010-10-14T16:51:13.247 回答