[英]Unexpected result using a CASE statement in sql query (oracle DB)
我有這個查詢
SELECT
CASE WHEN EXISTS (SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI')
THEN p2.PARM_VALUE
ELSE p1.PARM_VALUE
END as RIGHE
FROM
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p1,
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p2
基本上我想在第二個查詢至少有一行時返回第二個查詢的值,否則返回第一個查詢的結果。 現在,這些是返回值:
SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI' //No retrun
SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI' //returns 10
SELECT
CASE WHEN EXISTS (SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI')
THEN p2.PARM_VALUE
ELSE p1.PARM_VALUE
END as RIGHE
FROM
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p1,
(SELECT PARM_VALUE
FROM BO_PARM
WHERE (ENTE_CD = '7316')
AND PARM_CD = 'PAGINAZIONE_PROMOZIONI') p2 //no return, i was expecting 10
我在CASE語句中做錯了什么?
您現有的查詢在兩個子查詢之間具有隱式笛卡爾連接-這意味着其中一個查詢返回n行而另一個查詢返回m行,您將看到總共返回了m * n行-即。 第一組的行與第二組的行的每種組合。
因此,如果您在任一組中都返回了0行,則將看到總共返回了0行。
假設兩個查詢都不返回多於一行,則修改后的查詢的最簡單版本可能如下:
SELECT coalesce(
(SELECT PARM_VALUE FROM BO_PARM WHERE (ENTE_CD = '7316') AND PARM_CD = 'PAGINAZIONE_PROMOZIONI'),
(SELECT PARM_VALUE FROM BO_PARM WHERE (ENTE_CD = '0000' OR ENTE_CD = 'XXXX') AND PARM_CD = 'PAGINAZIONE_PROMOZIONI')
)
您正在對兩個視圖進行隱式聯接,其中兩個視圖為空(p1)。
這可能是一個方法:
with a as
(SELECT
PARM_VALUE,
case when (ENTE_CD = '0000' OR ENTE_CD = 'XXXX') then 1
when ENTE_CD = '7316' then 2
end as rnk
FROM BO_PARM
WHERE PARM_CD = 'PAGINAZIONE_PROMOZIONI' AND
((ENTE_CD = '0000' OR ENTE_CD = 'XXXX') OR (ENTE_CD = '7316') )
)
select PARM_VALUE
from a
where rnk = (select min(rnk) from a)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.