如何在SQL中的WHERE子句中动态使用条件

时间:2013-06-03 07:27:31

标签: sql oracle oracle10g

在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);

但是这给了我一个错误"缺少表达式"

1 个答案:

答案 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)

但是,正如我所说,这是一个不好的做法,维护起来很糟糕,你实际上是在复制你的函数,在查询中生成条件。你真的应该考虑存储过程:)