2013-02-14 150 views
5

我想選擇一組不同的結果爲根據產品類型的產品。 因此,如果我的產品應該是一本書,我希望它能夠查找普通產品的UPC和藝術家,但這些細節無關緊要,而對於另一種產品,我想要一組完全不同的結果。SELECT CASE WHEN THEN(SELECT)

SELECT CASE Product.type_id 
    WHEN 10 THEN (
     SELECT 
     Product.product_id, 
     Product.type_id, 
     Product.product_name, 
     Product.UPC, 
     Product_Type.type, 
     CONCAT_WS(' ' , first_name, middle_name, last_name) AS artistC 
     FROM Product, Product_Type, Product_ArtistAuthor 
     WHERE Product.type_id = Product_Type.type_id 
     AND Product.product_id = $pid 
     AND Product.artist_id = Product_ArtistAuthor.artist_id 
    ) 
    ELSE (
     SELECT 
     Product.product_id, 
     Product.type_id, 
     Product.product_name, 
     Product_Type.type 
     FROM Product, Product_Type 
     WHERE Product.type_id = Product_Type.type_id 
     AND Product.product_id = $pid 
    ) 
END 
FROM Product 
WHERE Product.product_id = $pid 

我不知道我要去的地方錯了

+0

將SQL放入提琴 - sqlfiddle.com – 2013-02-14 23:35:20

回答

0

對於啓動第一選擇有6列,第二個有4列。也許讓兩者具有相同數量的列(添加空值?)。

6

你可以嘗試其他格式的case語句

CASE WHEN Product.type_id = 10 
THEN 
(
    Select Statement 
) 
ELSE 
(
    Other select statement 

) 
END 
FROM Product 
WHERE Product.product_id = $pid 

更多信息請參見http://msdn.microsoft.com/en-us/library/ms181765.aspx

+2

這對性能來說確實很糟糕。你還是使用連接,否則每個這樣的查詢運行時,它會做其他選擇的每一行的時間。真的很貴。請參閱下面的備用解決方案 – 2014-02-25 08:18:51

0

我結束了從SELECT查詢離開公共屬性,並在頁面製作第二SELECT查詢以後。我用一個PHP IF命令調用用於根據第一SELECT查詢不同的腳本,則腳本包含在所述第二SELECT查詢。

5

您應該避免使用嵌套的選擇,我會去儘量說你不應該在你的聲明的實際選擇部分使用它們。您將爲每個返回的行運行該選擇。這是一個非常昂貴的操作。而是使用連接。它更可讀,性能更好。

在你的情況下查詢應幫助。注意case語句仍然存在,但現在它是一個簡單的比較操作。

select 
    p.product_id, 
    p.type_id, 
    p.product_name, 
    p.type, 
    case p.type_id when 10 then (CONCAT_WS(' ' , first_name, middle_name, last_name)) else (null) end artistC 
from 
    Product p 

    inner join Product_Type pt on 
     pt.type_id = p.type_id 

    left join Product_ArtistAuthor paa on 
     paa.artist_id = p.artist_id 
where 
    p.product_id = $pid 

我使用了一個左連接,因爲我不知道業務邏輯。