我正在尝试在SQL(oracle)中放置多个静态in子句并且它不起作用,任何人都有想法或解决它。以下是我正在尝试做的事情
select *
from Table
where ('1', '2') in ('1', '2', '3')
我知道可以使用OR子句来完成,但我不想使用它,因为参数太多了。
答案 0 :(得分:0)
由于含糊不清,无法完成你想要的工作。例如,该语法意味着" 1和2是否在1,2,3"或者它意味着" 1是1,2,3或2是1,2,3"。
我认为看看生成这个静态条款的内容以及实际最终目标是什么真的很有帮助...然后我会编辑我的答案来帮助更多。
修改强>
我认为您的应用程序设计中存在一个简单的逻辑缺陷。是否也不能完全删除(1,2,3)条款,而不是考虑你的' 1,2'作为静态,只需引用列。例如,通过稍微调整您的(错误开发的)BI报告,可以实现您想要的目标:
select *
from Table
where myCharColumn in ('1', '2')
答案 1 :(得分:0)
我猜您的查询旨在灵活处理一堆输入选项并以某种方式动态调整输出。也许这是一种有效的方法。通常这些BI系统仍然需要语法上有效的查询,所以很遗憾,您无法动态构建整个查询。
with list(val) as (
select val from master_list_of_values where val in (? /* BI_Parameter */)
)
select * from Table
where
A in (select id from list)
or B in (select id from list)
更新:根据您的修改,这将有效,但我不知道它是否总能产生出色的计划:
with security_test(passed) as (
select count(*) as passed
from security_groups
where group_id in (? /* BI_Parameter */) and group_id in (/* hard-coded list */)
)
select * from Table
where (select passed from security_test > 0)
您也可以使用values
表达式中的列表进行硬编码,而不是使用" security_groups"表
with security_test(passed) as (
select count(*) as passed
from (values (1), (2)) security_groups(group_id)
where group_id in (? /* BI_Parameter */)
)
select * from Table
where (select passed from security_test > 0)
这是另一个想法......
with security_test(passed) as (
select count(*) as passed
from (values (1), (2)) security_groups(group_id)
where group_id in (? /* BI_Parameter */)
having count(*) > 0 /* will this collapse to zero rows? */
)
select * from Table, security_test