2013-10-29 114 views
0

我可以在case語句中使用子查詢嗎?這可能嗎?
這裏是我的代碼:我可以在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 ."' 
+0

由於錯誤轉義,您將會得到語法錯誤 –

+0

您是否嘗試過?結果是什麼,它是否給出了錯誤,如果是的話,有什麼錯誤... –

+0

你是什麼意思? –

回答

0

要回答你的問題,是的,你可以有一個Case語句中的子查詢。

此外,在上面的查詢中,我認爲你有另一個問題,那就是你正在對包含子查詢的表達式進行聚合,這會產生錯誤。

+0

[似乎對我很好](http://sqlfiddle.com/#!2/aed6c/3) – GarethD

0

當然可以,但你必須用括號括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 

但是你仍然可以得到錯誤,如果有多個行返回

+0

正確,但在他的查詢中,在SUM內部,這會給他「不能對包含聚集或子查詢的表達式執行聚合函數」。 –

0

是的,但你的子查詢需要在括號:

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,且僅當$priceVal <> 1返回p.dPrice。這樣可以避免在MySQL中很難優化的昂貴子查詢。

Simple Example on SQL Fiddle

+0

tnx先生。 garethID –

相關問題