7

我正在尝试根据产品类型为产品选择一组不同的结果。因此,如果我的产品应该是一本书,我希望它查找普通产品的 UPC 和 Artist,但是这些细节无关紧要,而对于另一种产品,我想要一组完全不同的结果。

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

我不确定我哪里出错了

4

4 回答 4

13

您可以尝试其他格式的案例陈述

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

于 2013-02-15T00:10:35.100 回答
8

您应该避免使用嵌套选择,我会说您永远不应该在语句的实际选择部分中使用它们。您将为返回的每一行运行该选择。这是一个非常昂贵的操作。而是使用连接。它更具可读性,性能也更好。

在您的情况下,下面的查询应该会有所帮助。请注意,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

因为我不知道业务逻辑,所以我使用了左连接。

于 2014-02-25T08:33:42.660 回答
0

首先,第一个选择有 6 列,第二个选择有 4 列。也许使两者具有相同数量的列(添加空值?)。

于 2013-02-14T23:33:23.263 回答
0

我最终离开了 SELECT 查询中的公共属性,并稍后在页面中进行了第二个 SELECT 查询。我使用 php IF 命令根据第一个 SELECT 查询调用不同的脚本,这些脚本包含第二个 SELECT 查询。

于 2013-02-24T21:25:12.260 回答