0

我在编写这个查询时遇到了很大的问题。

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

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可能会创建一个复合唯一键,但我没有创建一个。

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

更新:
当传递“有机 2”时,由于没有为第 4 行定义类型,因此第 6 行优先于第 4 行。

4

2 回答 2

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

在此处输入图像描述

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

EXEC dbo.GetFoods @FoodType = 'Organic 2'

在此处输入图像描述

于 2012-07-23T06:03:32.100 回答
0

你的问题不清楚;无论如何,考虑到您想在通过1,2, 3, 4 and 6时返回'Organic 2',您可以创建这个存储。它将返回 is 的字段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
于 2012-07-23T05:22:27.767 回答