好吧,当我们要选择列中没有任何内容的记录时,我们可以使用它:
SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL;
但是,在大多数情况下,我看到开发人员使用它:
SELECT * FROM my_table WHERE my_column IS NULL OR my_column = ''
这两者之间有什么偏好吗? (例如,性能,默认支持,版本支持等)
如果是,请解释。
答案 0 :(得分:3)
评估单行上的两个表达式不应该产生如此大的差异。人们使用第二个版本的原因是使用索引。 Mysql对此有一个特殊的优化,甚至可以使用or
。
IS NULL优化
MySQL可以对col_name IS NULL执行相同的优化,它可以用于col_name = constant_value。例如,MySQL可以使用索引和范围来搜索带有IS NULL的NULL。
如果WHERE子句包含声明为NOT NULL的列的col_name IS NULL条件,则该表达式将被优化掉。在列可能仍然产生NULL的情况下不会发生这种优化;例如,如果它来自LEFT JOIN右侧的表格。
MySQL还可以优化组合col_name = expr或col_name IS NULL ,这是一种在已解析的子查询中很常见的形式。使用此优化时,EXPLAIN显示ref_or_null。
答案 1 :(得分:1)
据我所知,关于执行时间或性能的最佳方式是:
SELECT * FROM my_table WHERE my_column = ''
答案 2 :(得分:1)
在字段上调用函数(在某个条件中)会自动丢弃该字段上可用于加速查询的任何潜在索引。在条件列表中使用OR
通常会做同样的事情(但对于所有索引)。
然而,对于前者,你最终会为每一行进行函数调用;对于后者,有可能利用短路评估。
当然,还有第三个选项可以使用索引......
SELECT * FROM my_table WHERE my_column IS NULL
UNION
SELECT * FROM my_table WHERE my_column = ''
但是UNION / 2查询的成本可能超过索引使用的好处;取决于实际数据。
答案 3 :(得分:1)
两种结构不一样。来自the MySQL documentation page:
NULLIF(expr1,expr2)
Returns NULL if expr1 = expr2 is true, otherwise returns expr1.
This is the same as:
CASE WHEN expr1 = expr2
THEN NULL
ELSE expr1
END.
因此,此逻辑正在测试" NULL
或一个空字符串的列。"
my_column
目前为NULL,则该函数将返回其值(NULL ...),因为它不等于空字符串。my_column
为空字符串,则该函数将返回NULL。我衷心同意纳维德的回答说,"这是可爱的' ......不可爱。" 他的回答("使用OR
...")会导致非常简单的SQL乍一看是明显的。这个"聪明"解决方案不是。 (启动可能效率稍差。)
当然,在设计数据库时,您真的希望避免这种事情的必要性。你永远不想存储"空字符串"在VARCHAR类型字段中,除非它真正 的情况是"我们有一个非NULL值,并且该值确实是'一个空字符串'"
答案 4 :(得分:0)
一般来说,人们会将=''部分是因为SQL Server将其存储为空字符串,这与NULL不同。
参考链接: openshac's answer