2012-07-23 51 views
0

我在写这个查询时有很大的时间问题。如何根据sql中的输入参数过滤行?

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

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行

+0

也许'NULL'可以是任何类型的。 – Ambrose 2012-07-23 05:24:58

+0

我认为他想在'有机2'通过时返回1,2,3,4和6 .. – 2012-07-23 05:25:15

+1

@marc_s - 如果他想要得到与他们输入相匹配的所有东西并且否则为空,这是有道理的 – dfb 2012-07-23 05:35:20

回答

1

试试这个,如果你在SQL Server上或更新版本(你没有提到...):

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

+0

不能相信你有我的数据的一个工作的例子!你太棒了。感谢您的时间,非常感谢。 – 2012-07-23 21:14:55

0

你的问题是不明确;无论如何,考虑到你想返回1,2, 3, 4 and 6'Organic 2'通过, 你可以creathe这存储。它将返回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 
+0

不,我只想要1,2,3和6行。 – 2012-07-23 05:58:12

相关问题