繁体   English   中英

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

[英]How to use conditions dynamically in WHERE clause in SQL

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

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

有两种方法可以实现此目的。 首先,通过在存储过程中使用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语句。 例如:

    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 $的订单,但是在每月的第一天仅使用此条件。 然后,仅在一个月的第一天使用求和条件的视图将如下所示:

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)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM