簡體   English   中英

我可以在case語句中使用子查詢嗎?

[英]Can I use a subquery inside a case statement?

我可以在case語句中使用子查詢嗎? 這可能嗎?
這是我的代碼:

SELECT SUM(icd.discrepancy * (
    CASE WHEN $priceVal = 1 
    THEN SELECT i.dPrice FROM item_tb i 
    WHERE i.ID = icd.itemID
    ELSE SELECT p.dPrice FROM price_tb p 
    WHERE p.brID = '". $brID ."' AND p.itemID = icd.itemID
    END
)) as total
FROM invcountd_tb icd
WHERE icd.coID = '". $_SESSION['coID'] ."'
AND icd.invCounthID = '". $ID ."'

是的,可以,但是必須將子查詢括在括號ee中:

CASE WHEN $priceVal = 1 THEN (SELECT i.dPrice FROM item_tb i WHERE i.ID = icd.itemID)                           
 ELSE (SELECT p.dPrice FROM price_tb p WHERE p.brID = '". $brID ."' AND p.itemID = icd.itemID)                           
 END

但是,如果返回多行,您仍然會收到錯誤消息

是的,但是您的子查詢需要放在括號中:

SELECT SUM(icd.discrepancy * (
                   CASE WHEN $priceVal = 1 THEN 
                            (SELECT i.dPrice FROM item_tb i WHERE i.ID = icd.itemID)
                        ELSE 
                            (SELECT p.dPrice FROM price_tb p WHERE p.brID = '". $brID ."' AND p.itemID = icd.itemID)
                        END
                    )) as total
FROM
    invcountd_tb icd
WHERE
    icd.coID = '". $_SESSION['coID'] ."'
AND
    icd.invCounthID = '". $ID ."'

但是,我將其重寫如下:

SELECT  SUM(icd.discrepancy * COALESCE(i.dPrice, p.dPrice))
FROM    invcountd_tb icd
        LEFT JOIN item_tb i 
            ON i.ID = icd.itemID
            AND $priceVal = 1
        LEFT JOIN price_tb p 
            ON p.brID = '". $brID ."' 
            AND p.itemID = icd.itemID
            AND $priceVal <> 1
WHERE   icd.coID = '". $_SESSION['coID'] ."'
AND     icd.invCounthID = '". $ID ."'

您的加盟條件,會為你的case語句(即返回。只有i.dPrice如果$priceVal = 1 ,並只返回p.dPrice如果$priceVal <> 1 。這就避免了昂貴的子查詢這是在MySQL優化很差。

SQL小提琴上的簡單示例

要回答您的問題,是的,您可以在Case語句中包含一個子查詢。

此外,在上面的查詢中,我認為您還有另一個問題,即您正在對包含子查詢的表達式執行聚合,這會產生錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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