2013-06-03 4 views
1

В SQL я хочу заменить несколько условий (множество условий не известно во время компиляции) с функцией в предложении WHERE, где эта функция вернет множество условий (созданный во время выполнения).Как динамически использовать условия WHERE в SQL

Например, функция FUNC_CON возвращает набор условий на выполнение запроса:

select FUNC_CON from dual; 
--output is: condition1 = value1 AND condition2 = value2 AND so on.. 

Пожалуйста, укажите, как использовать этот выходной в другом запросе на выборку.

Я уже выполнил следующий код:

select * from table1 where (select FUNC_CON from dual); 

Но это дает мне сообщение об ошибке с «отсутствует выражение»

+0

Это сообщение об ошибке, потому что оно неверно SQL - вы не говорите, что делать с результатами подзапроса, т.е. он отсутствует * «выражение» *. –

+0

Вы можете предложить альтернативу для использования этой функции в предложении WHERE SQL? – user1986608

ответ

0

Есть два способа, как можно достичь этого. Во-первых, используя динамический SQL в хранимой процедуре. Что-то в этом роде:

PROCEDURE CR_VIEW IS 
cond_str VARCHAR2... 
BEGIN 
... 
SELECT FUNC_CON INTO cond_str FROM DUAL; 
EXECUTE IMMEDIATE 'CREATE OR REPLACE VIEW ... AS SELECT ... FROM ... 
WHERE ' || cond_str; 
... 
END CR_VIEW; 

Или просто путем непосредственной реализации вашей функции в создании оператора представления с использованием операторов условий. Для exapmle:

CREATE OR REPLACE VIEW ... AS SELECT ... FROM ... 
    WHERE ((CASE WHEN (*condition on using condition*) 
THEN (*your condition, returning 1 then true*) ELSE 1 END = 1) AND ... 

Но второй будет намного сложнее поддерживать.


Для exapmle, у вас есть таблица заказов:

t_orders (order_id НОМЕР, ORDER_NAME VARCHAR2, order_sum NUMBER)

И вы хотите, чтобы создать представление, которое покажет вы заказываете сумму более 100 $, но используете это условие только несколько в первый день месяца. Затем, вид, который будет использовать условие на сумму только в первый день месяца, будет выглядеть следующим образом:

CREATE OR REPLACE VIEW V_ORDERS AS SELECT order_name FROM t_orders 
WHERE (CASE WHEN EXTRACT(day from current_date) = 1 THEN (CASE WHEN (order_sum > 100) THEN 1 ELSE 0 END) ELSE 1 END = 1) 

Но, как я сказал, что это плохая практика, и это ужасно, чтобы поддерживать, вы буквально копируя ваши функция, генерирующая условие в запросе. Вы действительно должны рассмотреть хранимую процедуру :)

+0

Можете ли вы привести более ясный пример для второго подхода –

+0

Отредактированный ответ. – Mikhail

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