【问题标题】:Using Case in WHERE condition MYSQL在 WHERE 条件 MYSQL 中使用大小写
【发布时间】:2022-01-20 00:45:40
【问题描述】:

是否可以像下面这样在 WHERE 条件下使用 CASE 语句?

SELECT act.id_activity FROM activity act
LEFT JOIN work w ON w.id_work = act.id_work
WHERE 
w.work_type=1
AND w.work_tender in (1,2)
AND act.id_activity_type IN 
(CASE WHEN w.work_tender=1 THEN '2,3' WHEN w.work_tender=2 THEN '2,3,4,9' END)

它不会返回错误,但结果总是显示 act.id_activity_type = 2 而不是 2,3 或 2,3,4,9

在这种情况下,1 个工作(表工作)可以有许多活动(表活动)。我想显示基于 work.work_tender 类型的活动。如果 work.work_tender=1 则需要选择 activity.id_activity_type IN (2,3)。如果work.work_tender=2 那么需要选择activity.id_activity_type IN (2,3,4,9)

【问题讨论】:

  • 我认为你应该把它放在SELECT 中。顺便说一句,当您要在最左边的表以外的表列上执行WHERE 时,执行LEFT JOIN 没有意义——除非您要提取不匹配的NULL。否则,它只是将您的查询变成JOIN
  • 另外,WHERE AND w.work_type=1 是错误的
  • 嗨@FanoFN。感谢您的关注。

标签: mysql sql where-clause


【解决方案1】:

您可以尝试通过OR & AND 编写正确的逻辑。

SELECT act.id_activity FROM activity act
LEFT JOIN work w ON w.id_work = act.id_work
WHERE 
w.work_type=1
AND (
    (act.id_activity_type IN ('2','3') AND w.work_tender=1) OR 
    (act.id_activity_type IN ('2','3','4','9') AND w.work_tender=2)
)

【讨论】:

    【解决方案2】:

    我认为 case 是用于这种情况的。我认为在这种情况下可以使用。也适用于 orderby 短语。

    【讨论】:

      【解决方案3】:

      也许你可以试试这个:

      SELECT * 
      FROM activity a 
      JOIN work w
      ON w.work_tender=
         CASE WHEN a.id_activity_type IN (2,3) THEN 1
              WHEN a.id_activity_type IN (2,3,4,9) THEN 2 END;
      

      如果a.id_activity_type 符合条件,我在这里使用CASE 表达式来分配匹配w.work_tender 的值。因此,如果a.id_activity_type IN (2,3) THEN 1 将与w.work_tender=1 匹配,同样与a.id_activity_type IN (2,3,4,9) THEN 2 将与w.work_tender=2 匹配。

      Demo fiddle

      【讨论】:

        猜你喜欢
        • 2014-07-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-09
        • 2018-12-24
        相关资源
        最近更新 更多