在SQL中,我想用WHERE子句中的函数替换多个条件(编译期间未知条件集),其中此函数将返回条件集(在运行时生成)。
例如,函数 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 :(得分:0)
有两种方法,如何实现这一目标。首先,通过在存储过程中使用dinamic 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;
或者直接使用条件运算符将函数直接实现到create 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 NUMBER, 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)
但是,正如我所说,这是一个不好的做法,维护起来很糟糕,你实际上是在复制你的函数,在查询中生成条件。你真的应该考虑存储过程:)