我在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')
)
显然它不起作用。 可能有什么办法吗?
提前谢谢。
答案 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关键字? 或尝试将列作为类别以使其更容易