在CASE中使用多个文本名...在THEN之后的WHEN语句(SQL)

时间:2013-08-12 13:09:06

标签: sql sql-server-2005 case case-when

我在MS SQL Server Management Studio 2005中编写SQL存储的prosedure时遇到了困难

该表如下所示

[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 个答案:

答案 0 :(得分:1)

你可以这样重写:

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

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

答案 1 :(得分: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'))

但是,您最好在数据本身中更明确地添加Catergory列,Aaron pointed out

答案 2 :(得分: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);

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

答案 3 :(得分:-1)

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

您是否尝试过设置END关键字? 或尝试将列作为类别以使其更容易