1

我一直坚持在 MS SQL Server Management Studio 2005 中编写 SQL 存储程序

该表如下所示

[Quantity] | [Plant]
        10 | Apple
        20 | Carrot
        30 | Lemon
        40 | Orange

该过程如下所示:

SELECT * 
FROM dbo.PLANTS
where [Plant] in (@Name)

我想要做的是设置 @Name='Fruits' 并从餐桌植物中获取所有水果。所以我写了类似的东西

SELECT * 
FROM dbo.PLANTS
where [Plant] in 
(
Case
when @Name='Fruits' then ('Apple', 'Lemon', 'Orange')
)

显然它没有用。有什么办法可以奏效吗?

先感谢您。

4

4 回答 4

1

你可以这样重写它:

WHERE @Name = 'Fruits' AND Plant IN ('Apple','Lemon','Orange')

但更好的是向另一个表添加一个类别并进行更简单的连接,这样您就不需要在存储过程中保留硬编码的水果列表和蔬菜列表。

于 2013-08-12T13:12:57.300 回答
0

我认为你想要的是这样的:

SELECT *
FROM dbo.PLANTS
WHERE (@Name='Fruits' and Plant in ('Apple', 'Lemon', 'Orange')) or
      (@Name = Plant);

您不需要该case声明来概括这一点。

SELECT *
FROM dbo.PLANTS
WHERE (@Name='Fruits' and Plant in ('Apple', 'Lemon', 'Orange')) or
      (@Name = 'Tropical' and Plant in ('Orange', 'Lemon', 'Mango')) or
      (@Name = Plant);

但是,如果您有太多选择,您应该将“名称”和植物之间的映射放在单独的表中。

于 2013-08-12T13:15:32.883 回答
0

你可以做

SELECT * 
FROM dbo.PLANTS
where 
  (@Name='Fruits' and [Plant] in ('Apple', 'Lemon', 'Orange'))

如果您想根据 选择其他内容@Name,您可以这样做:

SELECT * 
FROM dbo.PLANTS
where (@Name='Fruits' and [Plant] in ('Apple', 'Lemon', 'Orange'))
   or (@Name='Vegetables' and [Plant] in ('Tomato', 'Onion', 'Cucumber'))

但是,正如Aaron 指出的那样,最好在数据本身中更明确地说明这一点并添加一Catergory列。

于 2013-08-12T13:12:41.840 回答
-1
SELECT * 
FROM dbo.PLANTS
where [Plant] in 
(
Case
when @Name='Fruits' then ('Apple', 'Lemon', 'Orange') end
)

你试过放 END 关键字吗?或尝试将列作为类别以使其更容易

于 2013-08-12T13:16:30.487 回答