[英]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優化很差。
要回答您的問題,是的,您可以在Case語句中包含一個子查詢。
此外,在上面的查詢中,我認為您還有另一個問題,即您正在對包含子查詢的表達式執行聚合,這會產生錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.