繁体   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