选择当时的情况(选择)
Posted
技术标签:
【中文标题】选择当时的情况(选择)【英文标题】:SELECT CASE WHEN THEN (SELECT) 【发布时间】:2013-01-30 21:49:19 【问题描述】:我正在尝试根据产品类型为产品选择不同的结果集。 因此,如果我的产品应该是一本书,我希望它查找普通产品的 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
我不知道我哪里错了
【问题讨论】:
把 SQL 放到 fiddle - sqlfiddle.com 【参考方案1】:您可以尝试其他格式的案例陈述
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】:您应该避免使用嵌套选择,而且我想说的是,您永远不应该在语句的实际选择部分中使用它们。您将为返回的每一行运行该选择。这是一个非常昂贵的操作。而是使用连接。它更具可读性,性能也更好。
在您的情况下,下面的查询应该会有所帮助。请注意,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
由于不了解业务逻辑,所以我使用了左连接。
【讨论】:
【参考方案3】:首先,第一个选择有 6 列,第二个选择有 4 列。也许使两者具有相同数量的列(添加空值?)。
【讨论】:
【参考方案4】:我最终离开了 SELECT 查询的公共属性,并稍后在页面中进行第二个 SELECT 查询。我使用 php IF 命令根据第一个 SELECT 查询调用不同的脚本,这些脚本包含第二个 SELECT 查询。
【讨论】:
以上是关于选择当时的情况(选择)的主要内容,如果未能解决你的问题,请参考以下文章