编写此查询时遇到了大问题。
如果我的样本数据看起来像这样......
id Fruit name Group Type
-----------------------------------------
1 Orange Citrus null
2 Mango Sweet null
3 Red chilly Hot null
4 Green chilly Hot null
5 Green chilly Hot Organic 1
6 Green chilly Hot Organic 2
我想创建一个接受@FoodType
参数的存储过程。
@FoodType
作为NULL
传递时,SP应返回行1, 2, 3
和4
。 @FoodType
为Organic 2
,则SP应返回1, 2, 3
和6
。 在我的表中,FruitName
和Type
列可能会创建复合唯一键,但我没有创建一个。
编写此类查询的最佳方法是什么?
更新:
当传递'Organic 2'时,由于没有为第4行定义 Type ,因此第6行优先于第4行。
答案 0 :(得分:1)
如果您使用的是SQL Server 2005 或更新版本(您没有提及......),请尝试此操作:
CREATE PROCEDURE dbo.GetFoods(@FoodType VARCHAR(20))
AS
;WITH Data AS
(
SELECT
id, FruitName, GroupName, FruitType,
RowNo = ROW_NUMBER() OVER (PARTITION BY FruitName ORDER BY FruitType DESC)
FROM dbo.Fruits
WHERE (FruitType IS NULL OR FruitType = @FoodType)
)
SELECT
id, FruitName, GroupName, FruitType
FROM Data
WHERE RowNo = 1
在我的案例中,这似乎可以满足您的需求。
如果您传入NULL
,则会返回行1, 2, 3
和4
EXEC dbo.GetFoods @FoodType = NULL
如果你使用Organic 2
调用它,就会回来:
EXEC dbo.GetFoods @FoodType = 'Organic 2'
答案 1 :(得分:0)
你的问题不明确;无论如何,考虑到你希望在1,2, 3, 4 and 6
通过时返回'Organic 2'
,
你可以创造这个存储。它将返回NULL
的字段,如果参数为not NULL
,则会返回该条件。
create procedure dbo.YourProcedureName
(
@FoodType varchar(20)
)
AS
BEGIN
select
id,Fruit, name, Group,Type
from yourTable where Type IS NULL or Type = @FoodType
END