如何根据sql中的输入参数过滤行?

时间:2012-07-23 05:19:02

标签: sql sql-server

编写此查询时遇到了大问题。

如果我的样本数据看起来像这样......

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, 34
  • 如果@FoodTypeOrganic 2,则SP应返回1, 2, 36

在我的表中,FruitNameType列可能会创建复合唯一键,但我没有创建一个。

编写此类查询的最佳方法是什么?

更新:
当传递'Organic 2'时,由于没有为第4行定义 Type ,因此第6行优先于第4行。

2 个答案:

答案 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, 34

EXEC dbo.GetFoods @FoodType = NULL

enter image description here

如果你使用Organic 2调用它,就会回来:

EXEC dbo.GetFoods @FoodType = 'Organic 2'

enter image description here

答案 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