我可以在基于select值的where_in MySQL查询中使用IF或CASE吗?

时间:2016-11-28 16:15:34

标签: mysql

是的,基本上我需要的是基于同一个表中列的值的不同WHERE_IN子句,因此是相同的查询。

所以看下面的查询。 r.assigned_type是1或2,我需要有/或r.assigned_id IN子句。

我可以这样做吗?

SELECT `r`.`risk_id`, `r`.`assigned_type`, `r`.`risk_type_id`, `r`.`risk_name`, `r`.`next_review`, `r`.`last_review`, `r`.`status`, `a`.`area_name`, `u`.`first_name`, `u`.`last_name`
FROM `risk_assessments` `r`
LEFT JOIN `users` `u` ON `u`.`id` = `r`.`assigned_id`
LEFT JOIN `areas` `a` ON `a`.`area_id` = `r`.`assigned_id`
WHERE `r`.`org_id` = '3'
AND `r`.`risk_type_id` = '1'
AND `r`.`assigned` = '1'
AND `u`.`privilege_level` <= '7'
AND `r`.`assigned_id` IN('5', '10', '11', '12', '13', '14', '15')
OR `r`.`assigned_id` IN('9', '14')  

或者我是否需要选择子查询?

或者更糟糕的是我需要重新格式化表格,数据库结构和代码吗?

我想做的是这样的事情(例如缩短查询):

SELECT `r`.`risk_id`, `r`.`assigned_type`, `r`.`risk_type_id`
FROM `risk_assessments` `r`
WHERE `r`.`org_id` = '3'
AND `r`.`assigned` = '1'
AND `u`.`privilege_level` <= '7'
CASE WHERE r.assigned_type = 2
 `r`.`assigned_id` IN('5', '10', '11', '12', '13', '14', '15')
ELSE 
 `r`.`assigned_id` IN('9', '14')  

1 个答案:

答案 0 :(得分:4)

看起来您可以使用简单的AND / OR和一些括号,例如:

SELECT `r`.`risk_id`, `r`.`assigned_type`, `r`.`risk_type_id`
FROM `risk_assessments` `r`
WHERE `r`.`org_id` = '3'
AND `r`.`assigned` = '1'
AND `u`.`privilege_level` <= '7'
AND ((`r`.`assigned_type` = 2
     AND `r`.`assigned_id` IN('5', '10', '11', '12', '13', '14', '15'))
     OR `r`.`assigned_id` IN('9', '14'))