2015-06-18 3 views
-1

Я пытаюсь поставить несколько статических статей в SQL (oracle) и не работает, у кого-то есть идея или работа вокруг. Ниже то, что я пытаюсь сделатьСтатический в разделе sql

select * 
from Table 
where ('1', '2') in ('1', '2', '3') 

Я знаю, что это может быть сделано с помощью OR положение, но я не хочу, чтобы использовать его как есть слишком много аргументов.

+0

В словах, что логика вы хотели бы реализовать? Что первое является подмножеством последнего? Если предложение 'in' действительно статично, зачем вообще его добавлять? Или вы действительно имеете в виду, что один из двух списков (или обоих) динамически генерируется, но не основан на данных, хранящихся в базе данных? Почему этот тег «mysql» и «sql-server», если вы не используете эти базы данных? –

+0

в первую очередь извините за тег. Любой синтаксис sql, если кто-то может дать, я могу перевести его в Oracle. Правильный Аргумент динамически генерируется приложением, а левый жестко закодирован! –

+0

И какова логика, которую вы пытаетесь реализовать? То, что левый жестко запрограммированный список является строгим подмножеством правого списка? Есть ли причина, по которой вы не можете просто сделать это в запросе, а не запускать любой запрос, который вы запускаете, чтобы получить правый список? –

ответ

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) 

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 
+0

вся цель этого вопроса в том, что я пытаюсь избежать или условие, поскольку есть много аргументов :) –

+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') 
+0

это означает, что «1 находится в 1,2,3 или 2 в 1,2,3». Приложение BI генерирует правильный аргумент в предложении IN [('1', '2', '3')], а левый аргумент [('1', '2')] жестко закодирован! –

+0

Тогда есть недостаток в дизайне приложения. Какова цель запроса, если 1 находится в 1,2,3 или 2, составляет 1,2,3. Почему бы просто не спросить «мой Integer в (1,2)» –

+0

, цель заключается в достижении следующих условий без ИЛИ. выберите * из таблицы где '1' в ('1', '2', '3') или '2' в ('1', '2', '3') –

Смежные вопросы