Я предполагаю, что ваш запрос предназначена для гибкой ручки кучи вариантов ввода и динамически регулировать выход в в некотором роде. Возможно, это подход, который будет работать. Обычно эти 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)
UPDATE: На основе вашего редактирования, это будет работать, хотя я не знаю, если он всегда будет генерировать большие планы:
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
В словах, что логика вы хотели бы реализовать? Что первое является подмножеством последнего? Если предложение 'in' действительно статично, зачем вообще его добавлять? Или вы действительно имеете в виду, что один из двух списков (или обоих) динамически генерируется, но не основан на данных, хранящихся в базе данных? Почему этот тег «mysql» и «sql-server», если вы не используете эти базы данных? –
в первую очередь извините за тег. Любой синтаксис sql, если кто-то может дать, я могу перевести его в Oracle. Правильный Аргумент динамически генерируется приложением, а левый жестко закодирован! –
И какова логика, которую вы пытаетесь реализовать? То, что левый жестко запрограммированный список является строгим подмножеством правого списка? Есть ли причина, по которой вы не можете просто сделать это в запросе, а не запускать любой запрос, который вы запускаете, чтобы получить правый список? –