MySQL - 哪种方法更好地检查列是否为 null 或空

MySQL - Which way is better to check if a column is null or empty

好吧,当我们要 select 列中不包含任何内容的记录时,我们可以使用:

SELECT * FROM my_table WHERE NULLIF(my_column, '') IS NULL;

但是,在大多数情况下,我看到开发人员使用这个:

SELECT * FROM my_table WHERE my_column IS NULL OR my_column = ''

这两者之间有什么偏好吗? (例如性能、默认支持、版本支持等)

如果是,请说明。

据我所知,关于执行时间或性能的最佳方法是:

SELECT * FROM my_table WHERE my_column = ''

参考:How do I check if a column is empty or null in mysql

一般来说,人们之所以包含 ='' 部分是因为 SQL 服务器将其存储为空字符串,这与 NULL 不同。

Link 参考: openshac's answer

(在条件中)在字段上调用函数会自动丢弃该字段上可用于加速查询的任何潜在索引。在条件列表中使用 OR 通常会做同样的事情(但对于所有索引)。

但是,对于前者,您最终需要为每一行调用一个函数;对于后者,可以利用短路评估。

当然还有第三种选择,可以利用索引...

SELECT * FROM my_table WHERE my_column IS NULL
UNION
SELECT * FROM my_table WHERE my_column = ''

但是 UNION/two 查询的成本可能超过使用索引的好处;以实际数据为准

这两个构造是不一样的。来自 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,函数将 return 其值(NULL ...),因为它不等于空字符串。
  • 如果my_column 一个空字符串,函数将return NULL。
  • 如果有任何其他值,该值将被 returned。

我衷心同意 Naveed 的回答,"this is 'cute' ... don't be 'cute'." 他的回答 ("use OR ...") 结果非常简单 SQL 即刻显而易见 乍一看。这个 "clever" 解决方案不是。 (启动时效率可能略低。)

当然,在设计数据库时,您确实希望避免这种事情的必要性。您永远不想将 "empty strings" 存储在 VARCHAR 类型的字段中,除非它确实 "we have a non-NULL value, and that value really is 'an empty string.'"

的情况

在一行中计算两个表达式应该不会有这么大的差异。人们使用第二个版本的原因是索引的使用。 Mysql 对此进行了特殊优化,甚至可以与 or.

一起使用

IS NULL Optimization

IS NULL Optimization

MySQL can perform the same optimization on col_name IS NULL that it can use for col_name = constant_value. For example, MySQL can use indexes and ranges to search for NULL with IS NULL.

If a WHERE clause includes a col_name IS NULL condition for a column that is declared as NOT NULL, that expression is optimized away. This optimization does not occur in cases when the column might produce NULL anyway; for example, if it comes from a table on the right side of a LEFT JOIN.

MySQL can also optimize the combination col_name = expr OR col_name IS NULL, a form that is common in resolved subqueries. EXPLAIN shows ref_or_null when this optimization is used.