1

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

但这给了我一个“缺少表达”的错误

4

1 回答 1

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;

或者只是通过使用条件运算符直接将您的函数实现到创建视图语句中。例如:

    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 ...

但第二个将更难维护。


例如,您有一个订单表:

t_orders (order_id NUMBER, order_name VARCHAR2, order_sum NUMBER)

并且您想创建一个视图,它将向您显示总金额超过 100 美元的订单,但仅在每月的第一天使用此条件。然后,仅在每月第一天对 sum 使用条件的视图将如下所示:

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)

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

于 2013-06-03T10:42:19.933 回答