![](/img/trans.png)
[英]How to determine next row value using select and case in SQL server?
[英]How to select a row depending on if exist case in SQL Server?
我想選擇具有特定品牌的商品,如果品牌未包含在表格中,請選擇品牌名稱為“全部”的商品。 我有這樣的table1:
Discount | Brand
20 | ford
10 | all
我有一個名為@Brand_name的查詢參數。 如果存在於表格中,我想要的只是返回品牌的價格。 否則返回品牌名稱為“all”的價格。 這樣做的正確查詢是什么。 謝謝你的幫助。
嘗試這個:
SELECT TOP 1 Discount
FROM mytable
WHERE Brand = @Brand_name OR Brand = 'all'
ORDER BY CASE
WHEN Brand = 'all' THEN 1
ELSE 0
END
查詢總是返回一條記錄,因為選擇了Brand = 'all'
記錄,並且SELECT
子句中使用了TOP 1
。
如果您有更多的 'Brand'
記錄,並且您希望所有記錄都返回,那么您可以使用以下查詢:
;WITH CTE AS (
SELECT Discount,
RANK() OVER (ORDER BY CASE
WHEN Brand = 'all' THEN 1
ELSE 0
END) AS rnk
FROM mytable
WHERE Brand = @Brand_name OR Brand = 'all'
)
SELECT Discount
FROM CTE
WHERE rnk = 1
請試試這個:
IF EXISTS (SELECT 1 FROM table1 WHERE Brand = @Brand_name)
BEGIN
SELECT Discount FROM table1 WHERE Brand = @Brand_name
END
ELSE
BEGIN
SELECT Discount FROM table1 WHERE Brand = 'all'
END
添加這個作為另一個解決方案,不確定,如果這是更好的:
SELECT TOP 1 Discount FROM (
SELECT Discount FROM table1 WHERE BrandName=@Brand_name
UNION SELECT Discount FROM table1 WHERE BrandName='all'
) discount
我會采用不同的方法,我認為可以產生更好的性能:
SELECT top 1 discount ,
brand
FROM
( SELECT discount ,
brand ,
selector ,
min(selector) over () [minselect]
FROM
( SELECT discount ,
brand ,
1 [selector]
FROM mytable
WHERE brand = 'ford'
UNION ALL
SELECT discount ,
brand ,
2 [selector]
FROM mytable WHERE brand = 'all' ) r
GROUP BY discount ,
brand ,
selector ) r
WHERE selector = minselect
ORDER BY discount DESC
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.