Mysql Coalesce对字段的处理与where不同

Mysql Coalesce对字段的处理与where不同,mysql,sql,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,空,空 有人知道为什么coalsce不能正常工作吗 编辑: 经过一些研究,我决定在MYSQL workbench中尝试查询,发现当字段的end_date=0000-00-00:00时,我用来访问数据库的工具错误地返回n

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

select start_date, end_date, COALESCE(end_date, start_date) 
from log where log_id = 8999134
返回:2011-02-09 23:00:38,空,空

有人知道为什么coalsce不能正常工作吗

编辑

经过一些研究,我决定在MYSQL workbench中尝试查询,发现当字段的end_date=0000-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:380000-00-00:00:00,0

这是结果的第一行,但得到的结果与其他行相同。为什么where和not coalise的结束日期为空


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

如果值
NULL
实际上是一个字符串
'NULL'
,则会出现这种情况。这表明应该是日期的字段实际上被存储为字符串

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

编辑:


日期值
0
NULL

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

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

编辑:


日期值
0
NULL

不同,如果您的日期存储为0000-00-00:00:00:00,则Coalesce将不起作用,因为它不为NULL。请尝试以下案例:

    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
编辑2:

您不需要在where子句中使用NULL,因为您没有NULL值,您有
'0000-00-00 00:00:00'
,这不是NULL

所以不是

  where end_date is null
使用


如果您将日期存储为0000-00-00:00:00,那么Coalesce将不起作用,因为它不为NULL。请尝试以下案例:

    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
编辑2:

您不需要在where子句中使用NULL,因为您没有NULL值,您有
'0000-00-00 00:00:00'
,这不是NULL

所以不是

  where end_date is null
使用



这两个字段的数据类型都是datetime。查看我的编辑。关于您的编辑:那么为什么where子句将0000-00-00:00:00视为空?@NelsonTeixeira。我看不出有证据表明情况如此。事实上,
end\u date为null
返回的是
0
,这是“false”。正如我在@echo\u Me:chech my post的另一个答案中所说的那样。这个问题的起因是我使用了条件“where end_date为NULL”来获得结果。其中,end_date是'0000-00-00 00:00:00',mysql将返回该行,就像end_date是null@NelsonTeixeira . . . 你能在SQL FIDLE上复制这个吗?这两个字段的数据类型都是datetime。查看我的编辑。关于您的编辑:那么为什么where子句将0000-00-00:00:00视为空?@NelsonTeixeira。我看不出有证据表明情况如此。事实上,
end\u date为null
返回的是
0
,这是“false”。正如我在@echo\u Me:chech my post的另一个答案中所说的那样。这个问题的起因是我使用了条件“where end_date为NULL”来获得结果。其中,end_date是'0000-00-00 00:00:00',mysql将返回该行,就像end_date是null@NelsonTeixeira . . . 你能在SQL Fiddle上复制这个吗?好的。。事实上,我一直使用相同的想法,只使用if代替:if(end_date='0000-00-00 00:00:00',start_date,end_date)。但问题仍然存在:为什么where子句将0000-00-00:00:00视为无效?千万不要将0000-00-00-00:00:00视为无效,你的意思是什么?检查我的帖子。这个问题的起因是我使用了“where end_date为NULL”的条件来获得结果。其中,end_date是'0000-00-00 00:00:00',mysql会像end_date是null一样重新执行该行。null日期通常是更多的工作。但它们比查询的零日期快得多我的seggest将零日期转换为null,并使用coalesce和null条件,所有这些都将更快、更可靠。好的。。事实上,我一直使用相同的想法,只使用if代替:if(end_date='0000-00-00 00:00:00',start_date,end_date)。但问题仍然存在:为什么where子句将0000-00-00:00:00视为无效?千万不要将0000-00-00-00:00:00视为无效,你的意思是什么?检查我的帖子。这个问题的起因是我使用了“where end_date为NULL”的条件来获得结果。其中,end_date是'0000-00-00 00:00:00',mysql会像end_date是null一样重新执行该行。null日期通常是更多的工作。但是它们比查询的零日期快得多我的seggest将零日期转换为null,并使用coalesce和null条件,所有这些都将更快、更可靠。如果您的工具正在处理
null
值,然后人们可能会怀疑它也会在
为null时出错。不,因为我在SQL Workbench中测试了它,结果是相同的。最后的查询是一个真正的问题。如果在
where
子句中选择where
end\u date为null
,则该值必须在
select
中为真。如果你所说的都是真的,就像你写的一样,那可能是MySQL中的一个bug。也就是说,考虑到使用该软件的应用程序和人员众多,这似乎不太可能。如果您的工具正在处理
NULL
值,那么您可能会怀疑它也在处理
is NULL
。不,因为我在SQL Workbench中对其进行了测试,结果是相同的。最后的查询是一个真正的问题。如果您选择的是th中的
end\u date为空的位置