使用CASE实现动态where子句时,我遇到了一些复杂性。有没有其他方法可以解决以下问题?如果有人可以为此提供任何解决方案,我将不胜感激。
问题:有两个SQL查询需要合并为一个。我尝试了不同的方法来实现它,但失败了。 下面我提供了“组合查询”,如果条件是通用的(如果在两个查询中只使用“LIKE”操作),它将起作用,但这里它是不同的。 'Query-1'包含'LIKE',其中'Query-2'具有'NOT LIKE'运算符。
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%'
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
答案 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用于两个查询