减少SQL Server存储过程中的条件

时间:2018-03-13 23:56:05

标签: sql sql-server

我有一个item表,如下所示(SQL Server 2008)

Id  Name    Price
------------------
1   A        5
2   B        3
3   A        NULL
4   B        4

我正在编写存储过程以获取名称和价格的项目。我的参数是

@Name nvarchar(255)
@Price float

如果用户传递了确切的名称和价格,我可以从表中获得前1个匹配。

但如果用户传递的确切名称和价格不在表格中,我需要获得前1名称匹配和NULL价格记录。

如果没有任何NULL价格,则需要在不考虑价格的情况下将前1个名称与之匹配。

eg.
@Name = A
@Price = 5

Result Id = 1

@Name = A
@Price 6

Result Id = 3

@Name = B
@Price =5

Result Id = 2

在我的存储过程中,我写了几个If条件来获得上述结果。有没有办法在没有很多if条件的情况下获得上述内容?

2 个答案:

答案 0 :(得分:0)

我认为测试结果会更有效,但是这个SQL会给你你想要的东西:

DECLARE @name VARCHAR(1)= 'A';
DECLARE @price INT= 6;

-- tbl is the raw table
WITH tbl
     AS (
     SELECT 1 id, 'A' name, 5 price
     UNION ALL
     SELECT 2 id, 'B' name, 3 price
     UNION ALL
     SELECT 3 id, 'A' name, NULL price
     UNION ALL
     SELECT 4 id, 'B' name, 4 price)
     -- *********************
     -- Solution starts here
     -- *********************
     SELECT id, name, price
         FROM     tbl
     WHERE   name = @name
             AND price = @price
     UNION ALL
     SELECT id, name, price
    FROM     tbl
     WHERE   name = @name
             AND price IS NULL
             AND @price IS NULL
     UNION ALL
     SELECT TOP 1 id, name, price                 
     FROM         tbl
     WHERE        name = @name
                  AND NOT EXISTS
                (
                    SELECT NULL
                    FROM   tbl
                    WHERE  name = @name
                           AND price = @price
                );

答案 1 :(得分:0)

您可以使用order bytop (1)

执行此操作
select top (1) t.*
from t
where t.name = @name
order by (case when price = @price then 1
               when price is null then 2
               else 3
          end);