簡體   English   中英

如何根據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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM