【问题标题】:MySQL using BETWEEN comparison with NULLMySQL 使用 BETWEEN 与 NULL 进行比较
【发布时间】:2014-10-02 15:26:58
【问题描述】:

我的查询条件如下:

WHERE A.event_date BETWEEN B.start_date AND B.end_date

复杂之处在于,如果B.start_date 为NULL,则意味着远古时代,同样B.end_date 为NULL,则意味着现在。所以我还是想选择A.event_date > B.start_dateB.end_dateNULL的行,例如。

冗长的方法是

WHERE A.event_date BETWEEN B.start_date AND B.end_date
   OR (A.event_date > B.start_date AND B.end_date IS NULL)
   OR (B.start_date IS NULL AND A.event_date < B.end_date)

有没有更优雅的解决方案(特别是因为在一个查询中我有多个这样的条件)

【问题讨论】:

    标签: mysql null between


    【解决方案1】:

    IFNULL 可能会在这里提供帮助:

    WHERE A.event_date BETWEEN IFNULL(B.start_date,"1900-01-01") 
                       AND IFNULL(B.end_date,now());
    

    【讨论】:

    • 谢谢!这似乎有效。顺便说一句,我的上述解决方案有效吗? MySQL 说有语法错误。
    • 应该没问题。可能是查询的另一部分不正确?
    • 我已经实现了这个解决方案,BETWEEN + IFNULL() 似乎忽略了日期字段上的索引。
    【解决方案2】:

    COALESCE() 函数将返回参数列表中的第一个非空值。试试这个:

    WHERE A.event_date BETWEEN COALESCE(B.start_date,'1900-01-01') and COALESCE(B.end_date,CURRENT_TIMESTAMP)
    

    【讨论】:

    • 真的比 ifnull 更喜欢合并
    【解决方案3】:

    如果性能很重要...

    当我看到@tom-mac answer 时,我说:很好的解决方案,我需要测试一下,然后我看到@mw-goodjava answer 后我想比较一下。

    根据这个测试http://blogs.x2line.com/al/archive/2004/03/01/189.aspx,似乎使用IFNULL()而不是COALESCE()函数更好,但最好还是像这样使用WHERE ... OR ... IS NULL

    WHERE (A.event_date >= B.start_date OR B.start_date IS NULL)
      AND (A.event_date <= B.end_date OR B.end_date IS NULL)
    

    所以查询更复杂,不使用BETWEEN,但最后我会选择那个解决方案。

    【讨论】:

      猜你喜欢
      • 2013-05-04
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      相关资源
      最近更新 更多