SQL中的Dynamic Where子句 - 需要解决特定场景

时间:2018-01-31 13:34:19

标签: sql oracle

使用CASE实现动态where子句时,我遇到了一些复杂性。有没有其他方法可以解决以下问题?如果有人可以为此提供任何解决方案,我将不胜感激。

问题:有两个SQL查询需要合并为一个。我尝试了不同的方法来实现它,但失败了。 下面我提供了“组合查询”,如果条件是通用的(如果在两个查询中只使用“LIKE”操作),它将起作用,但这里它是不同的。 'Query-1'包含'LIKE',其中'Query-2'具有'NOT LIKE'运算符。

查询-1:

SELECT * FROM TABLE_NAME X
WHERE X.COL1 = 10
AND X.LOG_DATE >= TO_DATE('07/01/2016', 'MM/DD/YYYY')
AND X.COL2 LIKE '%DATA-1%'

查询-2:

SELECT * FROM TABLE_NAME X
WHERE X.COL1 = 10
AND X.LOG_DATE < TO_DATE('07/01/2016', 'MM/DD/YYYY')
AND X.COL2 NOT LIKE '%DATA-2%'

综合查询:

SELECT * FROM TABLE_NAME X
WHERE X.COL1 = 10 
AND X.COL2 LIKE
CASE
  WHEN (X.LOG_DATE >= TO_DATE('07/01/2016', 'MM/DD/YYYY'))
    THEN 
      '%DATA-1%'
  ELSE 
    '%DATA-2%'
END

3 个答案:

答案 0 :(得分:5)

您可以在where子句中使用OR语句,如下所示:

SELECT * FROM TABLE_NAME X
WHERE (X.COL1 = 10
AND X.LOG_DATE >= TO_DATE('07/01/2016', 'MM/DD/YYYY')
AND X.COL2 LIKE '%DATA-1%')
OR
(X.COL1 = 10
AND X.LOG_DATE < TO_DATE('07/01/2016', 'MM/DD/YYYY')
AND X.COL2 NOT LIKE '%DATA-2%')

答案 1 :(得分:1)

解决方案使用案例(但可能不是问题的最佳解决方案):

select *
  from table_name x
 where x.col1 = 10
   and (case
          when (x.log_date >= to_date('07/01/2016', 'MM/DD/YYYY'))
               and x.col2 like '%DATA-1%' then
           1 
          when (x.log_date < to_date('07/01/2016', 'MM/DD/YYYY'))
               and x.col2 not like '%DATA-2%' then
           1
          else
           0
       end) = 1

答案 2 :(得分:-1)

您可以将UNION或UNION ALL用于两个查询