繁体   English   中英

存储过程-排除条件在单独的表中

[英]Stored Procedure - Exclude where conditions in a separate table

我陷入困境,需要您的帮助。

我有一个带select语句的存储过程,该语句具有一些联接,并且在许多情况下每个产品设置的条件。 结构如下所示。

SELECT * 
FROM TABLE1 T1
INNER JOIN T2 ON T1.ID = T2.ID
INNER JOIN T3 ON T1.ID = T3.ID
WHERE T1.STATUS = 'UnResolved'
AND
(
   T1.COL1 NOT IN ('X', 'Y', 'Z')

   AND (T1.Product != 'TEST1' OR T2.COL2 = 'V2' OR T3.COL3 = 'V3') 
   AND (T1.Product != 'TEST2' OR T2.COL2 = 'V2' OR T3.COL3 = 'V3') 

   AND (T1.Product != 'TEST3' OR T2.COL4 = 'V4' OR T3.COL5 = 'V5') 
   AND (T1.Product != 'TEST4' OR T2.COL4 = 'V4' OR T3.COL5 = 'V5') 
)

任何产品只有两个固定的可能设置。

设置1:OR T2.COL2 ='V2'OR T3.COL3 ='V3'

设置2:OR T2.COL4 ='V4'OR T3.COL5 ='V5'

每次有新产品出现时,我们都需要使用相应的设置添加一个新的where条件。

现在,对于新要求,我们需要使用任何配置表来自动化此过程。

有人可以建议下面的事情吗

@。 表的结构

@。 修改选择查询,这样我们就不需要修改现有条件

@。 我们还需要注意,现有逻辑不会中断

提前谢谢了!!

使用product, type, col1, col2product, type, col1, col2创建表product_config product应该是T1.product外键。

为每个产品在其中创建一行。 type指定使用col2, col3col4, col5

product    type 
TEST1       1 
TEST2       1
TEST3       2
TEST4       2

然后查询将如下所示:

SELECT * 
FROM TABLE1 T1
INNER JOIN PRODUCT_CONFIG C ON (T1.PRODUCT = C.PRODUCT)
INNER JOIN T2 ON T1.ID = T2.ID
INNER JOIN T3 ON T1.ID = T3.ID
WHERE T1.STATUS = 'UnResolved'
AND
(
  T1.COL1 NOT IN ('X', 'Y', 'Z')

  AND (C.TYPE != 1 OR T2.COL2 = 'V2' OR T3.COL3 = 'V3')
  AND (C.TYPE != 2 OR T2.COL4 = 'V4' OR T3.COL5 = 'V5')
)

我之前使用的1个解决方案是创建一个具有您的输入参数和使用条件的查找表。 例如,您可以使用以下各列创建一个表:

  1. 产品名称
  2. 产品类别
  3. PRODUCT_PRICE
  4. WHERE_CLAUSE

使用此查询查询,说出您的姓名,类型和价格:

SELECT WHERE_CLAUSE FROM PRODUCT_CRITERIA WHERE PRODUCT_NAME = :PRODUCT_NAME AND  PRODUCT_TYPE = :PRODUCT_TYPE AND PRODUCT_PRICE = :PRODUCT_PRICE

在Oracle中,可以使用WHERE_CLAUSE使用'EXECUTE IMMEDIATE'执行动态查询

暂无
暂无

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

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