用AND子句oracle解码

时间:2016-04-21 17:53:36

标签: sql oracle

我想在查询中使用参数,但我无法处理它

我有3个大选择raport,我只是想使用参数来代替某些代码,这取决于选择

我有3种不同的Where条件

第一
..WHERE A.CANCELLED = 'FALSE' AND a.open_amount!=0 AND A.IDENTITY = '&client_id'..

第二

...WHERE A.CANCELLED = 'FALSE' AND A.IDENTITY = '&client_id' ...

第三

WHERE AND A.CANCELLED = 'FALSE' AND a.invoice_amount != a.open_amount AND A.IDENTITY = '&client_id'

我尝试使用解码,但我想如果在第二种情况下有价值可能没问题,但是没有,我不能像这样解码

WHERE decode(xxx,x1,'AND a.open_amount!= 0',x2,'',x3, 'AND a.invoice_amount != a.open_amount')

我应该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

你的意思是,如果第一个“where condition”或第二个或第三个是/为TRUE,你想要整体为TRUE(选择行),你是否正在寻找一种简化的方法来编写它?也就是说,不用简单地将它们与OR组合?

要实现这一点,您不需要CASE和嵌套CASE语句或DECODE。你可以这样做:

WHERE A.CANCELLED = 'FALSE' 
  AND A.IDENTITY  = '&client_id'
  AND ( (xxx = x1 AND a.open_amount != 0) OR (xxx = x2) OR 
        (xxx = x3 AND a.invoice_amount != a.open_amount)    ) 

这更具可读性,意图很明确,如果需要可以更容易修改,......

答案 1 :(得分:1)

你可以试试像 -

 WHERE A.CANCELLED = 'FALSE'
   AND A.IDENTITY = '&client_id'
   AND a.open_amount <>
          (CASE
              WHEN x1 THEN 0
              WHEN x2 THEN a.open_amount + 1 -- This needs to be something that is always TRUE, to nullify the condition
              WHEN x3 THEN a.invoice_amount
           END);

修改:这是基于a.open_amountNUMBER的假设,并使用快速黑客来创建一个始终TRUE条件,如x <> x + 1。您应该根据您的数据将其更改为更适合您的任何内容。