簡體   English   中英

在SQL查詢(Oracle DB)中使用CASE語句的意外結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM