好吧,当我们要选择列中不包含任何内容的记录时,我们可以使用:
SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL;
Run Code Online (Sandbox Code Playgroud)
但是,在大多数情况下,我看到开发人员使用这个:
SELECT * FROM my_table WHERE my_column IS NULL OR my_column = ''
Run Code Online (Sandbox Code Playgroud)
这两者之间有什么偏好吗?(例如性能、默认支持、版本支持等)
如果是,请解释一下。
对单行上的两个表达式进行计算不应产生如此大的差异。人们使用第二个版本的原因是索引的使用。Mysql 对此有特殊的优化,甚至可以与or.
请参阅IS NULL 优化
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。