在 WHERE 条件下使用 Case MYSQL

Using Case in WHERE condition MYSQL

是否可以像下面这样在 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)

它 returns 没有错误,但结果总是显示 act.id_activity_type = 2 而不是 2,3 或 2,3,4,9

在这种情况下,1 个工作(table 个工作)可以有多个活动(table activity)。我想显示基于 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)

您可以尝试通过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)
)

我认为 case 用于那种情况。我认为在这种情况下可以使用。以及 orderby 短语。

也许你可以试试这个:

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