好的,当我们需要选择某一列中没有任何内容的记录时,可以使用以下方法:
SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL;
但是,在大多数情况下,我看到开发人员使用以下代码:
SELECT * FROM my_table WHERE my_column IS NULL OR my_column = ''
这两个有没有什么偏好?(例如性能,默认支持,版本支持等)
如果有,请解释。
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 OR col_name IS NULL,这是已解析的子查询中常见的一种形式。当使用此优化时,EXPLAIN显示ref_or_null。
在条件中对字段调用函数会自动丢弃该字段可能用于加速查询的任何潜在索引。在条件列表中使用 OR
通常也会这样做(但是对于所有索引都是如此)。
然而,对于前者,您最终会为每一行进行一次函数调用;对于后者,存在利用短路求值的可能性。
当然,还有第三种选项可以利用索引...
SELECT * FROM my_table WHERE my_column IS NULL
UNION
SELECT * FROM my_table WHERE my_column = ''
但是使用UNION/两个查询的成本可能会超过索引使用的好处,具体取决于实际数据。
NULLIF()
并不实际将其处理为真正的函数调用。(它是否会像文档建议的那样替换为CASE
?它可能会...)##我对您基于UNION
的替代方案一开始并不“感到舒适”,而且只是“不想再花第二或第三次浏览来弄清楚它是否真的有效”。我敢说,查询优化器足够聪明以使用索引。所以,我宁愿看到“简单”而不是“聪明”。但是,这只是我的看法。* - Mike RobinsonNULLIF(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。我完全同意Naveed的答案,他说:“这很‘可爱’...不要太‘可爱’。”他的答案(“使用OR
...”)会导致非常简单的SQL语句,一眼就能看出来。而这个“聪明”的解决方案则不然。(而且可能稍微低效一些。)
当设计数据库时,当然你确实想要避免这种情况的发生。除非真正的情况是“我们有一个非NULL值,并且该值确实是‘空字符串’”,否则永远不要将“空字符串”存储在VARCHAR类型的字段中。
OR
情况的比较;他们的答案给出了“... IS NULL OR ...”更优越的明确原因。 - Uueerdo