【问题标题】:Conditional in MYSQL where clauseMYSQL where 子句中的条件
【发布时间】:2013-08-29 08:39:24
【问题描述】:

我有一个查询,如果名为 OrderBy 的标志为 1,那么它是一个日历事件,我需要检查两个日期时间字段之间的范围。而所有其他类型我们只检查您正在查看的日期。我研究了 if 语句,并看到许多建议使用案例的帖子,因此我尝试将其实现到我的查询中。我的查询需要 where 的条件。我知道我有语法问题,这就是为什么我在这里希望有人能指出正确的方法。

感谢您的宝贵时间

我的查询目前

SELECT          activities.*, 
                activitytypes.orderby 
FROM            activities 
LEFT OUTER JOIN activitytypes 
ON              activities.typeid = activitytypes.typeid 
WHERE           activities.userid = 86 
AND             activities.typeid NOT IN ( 5, 
                                          10, 
                                          11, 
                                          12, 
                                          19 ) 
AND 
                CASE 
                                WHEN activities.orderby = 1 THEN activities.starttime >= '2013-08-26 04:00:00' 
                                AND             activities.endtime <= '2013-08-27 04:00:00' 
                                ELSE activities.activitydate = '2013-08-26' 
                                order BY        activitytypes.orderby, 
                                                activities.starttime

【问题讨论】:

    标签: mysql conditional case where


    【解决方案1】:

    只要使用足够的括号,您就可以使用 ANDOR 来做到这一点。

    我还假设activities.OrderBy 可以为空。如果不是这种情况,您可以删除空检查:

    SELECT activities.*, 
           activitytypes.orderby 
    FROM   activities 
           LEFT OUTER JOIN activitytypes 
                        ON activities.typeid = activitytypes.typeid 
    WHERE  activities.userid = 86 
           AND activities.typeid NOT IN ( 5, 10, 11, 12, 19 ) 
           AND ( ( activities.orderby = 1 
                   AND activities.starttime >= '2013-08-26 04:00:00' 
                   AND activities.endtime <= '2013-08-27 04:00:00' ) 
                  OR ( ( activities.orderby IS NULL 
                          OR activities.orderby != 1 ) 
                       AND activities.activitydate = '2013-08-26' ) ) 
    ORDER  BY activitytypes.orderby, 
              activities.starttime 
    

    或者,如果您仍想使用CASE,您只需使用END 关闭您的CASE 语句,如下所示:

    SELECT          activities.*, 
                    activitytypes.orderby 
    FROM            activities 
    LEFT OUTER JOIN activitytypes 
    ON              activities.typeid = activitytypes.typeid 
    WHERE           activities.userid = 86 
    AND             activities.typeid NOT IN ( 5, 10, 11, 12, 19 ) 
    AND             ( 
                      CASE 
                      WHEN activities.orderby = 1 THEN
                        activities.starttime >= '2013-08-26 04:00:00' AND activities.endtime <= '2013-08-27 04:00:00'
                      ELSE
                        activities.activitydate = '2013-08-26' 
                      END
                    ) 
    ORDER BY        activitytypes.orderby, 
                    activities.starttime
    

    【讨论】:

      猜你喜欢
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-20
      • 1970-01-01
      • 1970-01-01
      • 2021-10-07
      相关资源
      最近更新 更多