Mysql Coalesce对待字段的方式与where不同

时间:2014-05-14 11:13:07

标签: mysql sql

我在Mysql合并函数中遇到了一个奇怪的情况:

select start_date, end_date, COALESCE(end_date, start_date) 
from log where log_id = 8999134

返回:2011-02-09 23:00:38,NULL,NULL

任何人都知道为什么coalsce不能正常工作?

修改

经过一番研究后,我决定在MYSQL工作台中尝试查询,看到我用来访问数据库的工具在字段为end_date = 0000-00-00 00:00:00时错误地返回null。 但问题变得更加奇怪。上面的结果已经是一个调试。第一个问题是:

select id, start_date, COALESCE(end_date, start_date) 
from log where end_date is null

我调试的地方:

 select id, start_date, end_date, end_date is null 
 from log where end_date is null

,结果是:2011-02-09 23:00:38,0000-00-00 00:00:00,0

这是结果的第一行,但与其他行的结果相同。为什么end_date为NULL而不是合并?

这两个字段的数据类型是datetime

2 个答案:

答案 0 :(得分:3)

如果值NULL实际上是字符串'NULL',则会发生这种情况。这表明应该 date 的字段实际上存储为 strings

检查数据类型。如果它们是varchar()char(),那么这可能就是问题所在。然后,通过修复数据结构来解决问题。应使用本机数据库格式存储日期/时间。

编辑:

0的日期值与NULL不同。

答案 1 :(得分:1)

如果您的日期存储如此00:00:00那么Coalesce将无效,因为它不是NULL。尝试使用CASE:

    select id, start_date, CASE WHEN end_date = '0000-00-00 00:00:00' 
                                THEN start_date
                                ELSE end_date END as coalesced_date 
    from log where log_id = 8999134

或者这个:

SELECT id, start_date, 
CASE WHEN end_date ='0000-00-00 00:00:00' AND start_date != '0000-00-00 00:00:00'
         THEN start_date
     WHEN start_date ='0000-00-00 00:00:00' AND end_date != '0000-00-00 00:00:00'
          THEN end_date
     WHEN start_date ='0000-00-00 00:00:00' AND end_date = '0000-00-00 00:00:00'
          THEN 'They are nulled'
     ELSE end_date END as coalesced_date 
FROM log 
WHERE log_id = 8999134

EDIT2:

你不需要在where子句中使用NULL,因为你没有空值,你有'0000-00-00 00:00:00'并且这不是null。

所以而不是

  where end_date is null

使用

  where end_date != '0000-00-00 00:00:00'