【问题标题】:Mysql Coalesce treats field differently than whereMysql Coalesce 对待字段的方式与 where 不同
【发布时间】:2014-07-02 09:54:31
【问题描述】:

我在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 对于 where 和 not to coalesce 为 NULL?

两个字段的数据类型都是日期时间

【问题讨论】:

  • 如果您的工具与NULL 值混在一起,那么人们可能会怀疑它也与is null 混在一起。
  • 否,因为我在 SQL Workbench 中测试过,结果是一样的
  • 最后一个查询是一个真正的问题。如果您在 where 子句中选择 where end_date is null,则该值在 select 中必须为真。如果你所说的和你写的完全一样,那可能是 MySQL 中的一个错误。尽管如此,考虑到许多应用程序和使用该软件的人,这似乎不太可能。

标签: mysql sql


【解决方案1】:

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

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

编辑:

0 的日期值与 NULL 不同。

【讨论】:

  • 两个字段的数据类型都是日期时间。查看我的编辑。
  • 关于您的编辑:那么为什么 where 子句将 0000-00-00 00:00:00 视为 NULL ?
  • @NelsonTeixeira 。 . .我没有看到任何证据。事实上,end_date is null 正在返回 0,这是“假”。
  • 正如我在@echo_Me 的另一个回答中所说的那样:检查我的帖子。开始这个问题的原因是我使用条件“end_date 为 NULL”来获得结果。并且 end_date 是 '0000-00-00 00:00:00' mysql 正在返回该行,就好像 end_date 为空
  • @NelsonTeixeira 。 . .你能在 SQL Fiddle 上复制这个吗?
【解决方案2】:

如果您将日期存储为 0000-00-00 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' 并且这不是空的。

所以而不是

  where end_date is null

使用

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

【讨论】:

  • OK.. 实际上我已经使用了相同的想法,只使用 if 代替:IF(end_date = '0000-00-00 00:00:00', start_date, end_date)。但问题仍然存在:为什么 where 子句将 0000-00-00 00:00:00 视为 NULL ?
  • never 0000-00-00 00:00:00 被视为 null,你的意思是什么?
  • 查看我的帖子。开始这个问题的原因是我使用条件“end_date 为 NULL”来获得结果。并且 end_date 是 '0000-00-00 00:00:00' mysql 正在返回该行,就好像 end_date 为空一样。
  • 空日期通常更有效。但它们比查询的零日期快得多
  • 我的 seggest 将您的零日期转换为 null 并使用合并和 null 条件,一切都会更快更轻松。
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多