我有一个这样简单的表:
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但是找不到匹配它们的记录,我需要返回空值的行
你能帮我解决这个问题吗?
答案 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(如果存在)。