mysql选择条件1存在的列,否则条件2但不是两者

时间:2015-12-12 15:28:16

标签: mysql

我有一个这样简单的表:

id | com_id | sec_id | branch_id | code 
1      1         1        3        some_code_with_all_fields_notnull <<--- this one
2      2         3        3        some_code
3      3         2        6        some_code
4      1       NULL      NULL      some_code_with_some_fields_null <<--- or this one
5      2         3        9        some_code

现在,我需要选择一条记录,如下所示:
如果没有提供sec_id或branch_id作为参数,我只需要选择相应列值为null的行。如果它们已作为参数提供,我只需要选择相应列值与每个参数值匹配的行。

我试过像这样的普通where子句: select code from comcodes where com_id = :com_id and (sec_id = :sec_id or sec_id is null) and (branch_id = :branch_id or branch_id is null)

但是遍历所有行并返回符合这两个条件的所有行 这就是我不想要的。我希望它只返回一行满足第一个条件或第二行不满足

我使用“OR null”部分的原因是,如果提供了sec_id或branch_id但是找不到匹配它们的记录,我需要返回空值的行

你能帮我解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

一种解决方案是添加ORDER BY,然后添加LIMIT 1:

select code
from comcodes
where
  com_id = :com_id and
  (sec_id = :sec_id or sec_id is null)
  and (branch_id = :branch_id or branch_id is null)
order by
  CASE WHEN (sec_id is not null) THEN 1 ELSE 2 END
LIMIT 1

这将优先考虑sec_id not null(如果存在)。