我在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
答案 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'