如何解决结合CASE和IN
我正在使用分层数据,其中程序(PGM)和公立学校(PUB)属于学区(DIS)。我需要查看一个区的所有子记录,因此我试图使用where子句,其中子记录的类别应为“ DIS”,“ PUB”或“ PGM”。
但是,我尝试在此处使用的代码不起作用-我在第一个WHEN子句中列出多个值后,收到了ORA-00907:缺少右括号错误消息。
如何重新编写此记录,以便允许我选择与多个可能值之一匹配的记录?
WHERE o.cat IN
CASE (SELECT CAT from ads_organizations where org_id = :CUR_ORGID)
WHEN 'DIS' THEN ('DIS','PUB','PGM')
WHEN 'PUB' THEN ('PUB')
WHEN 'PRI' THEN ('PRI')
END
解决方法
使用布尔逻辑。不需要case
表达式:
FROM . . . CROSS JOIN
(SELECT CAT from ads_organizations where org_id = :CUR_ORGID) ao
WHERE (ao.cat = 'DIS' AND o.cat IN ('DIS','PUB','PGM')) OR
(ao.cat = 'PUB' AND o.cat = 'PUB') OR
(ao.cat = 'PRI' AND o.cat = 'PRI')
这可能可以简化为:
WHERE (ao.cat = o.cat) OR
(ao.cat = 'DIS' AND o.cat IN ('PUB','PGM')
但是,这取决于cat
可以采用的所有值
我建议使用布尔逻辑而不是case
表达式;它为条件提供了更大的灵活性。另外,您可以使用exists
将逻辑移到子查询本身。
您的伪代码相当直接的翻译是:
where exists (
select 1
from ads_organizations ao
where
ao.org_id = :CUR_ORGID
and (
(ao.cat in ('PUB','PRI') and ao.cat = o.cat)
or (ao.cat = 'DIS' and o.cat in ('DIS','PGM'))
)
)
可能也可以这样表达:
where exists (
select 1
from ads_organizations ao
where
ao.org_id = :CUR_ORGID
and (
ao.cat = o.cat
or (ao.cat = 'DIS' and o.cat in ('PUB','PGM'))
)
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。