[英]SQL : How to use “and” and “or” in a “Where” clause with “NOT IN” conditions
[英]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.