我有一个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
条件的情况下获得上述内容?
答案 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 by
和top (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);