MySQL - 哪种方法更好地检查列是空还是空

时间:2016-08-04 18:02:22

标签: mysql isnull

好吧,当我们要选择列中没有任何内容的记录时,我们可以使用它:

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

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

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

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

如果是,请解释。

5 个答案:

答案 0 :(得分:3)

评估单行上的两个表达式不应该产生如此大的差异。人们使用第二个版本的原因是使用索引。 Mysql对此有一个特殊的优化,甚至可以使用or

请参阅IS NULL Optimization

  

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 = ''

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

答案 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