问题描述
我有一张桌子,
id category column1 column2 column3
1 1 val1a val1b val1c
2 2 val2a val2b val2c
3 3 val3a val3b val3c
我需要根据多个条件从中选择列,如下所示。
SELECT id,category,column1,column2,column3
FROM table
WHERE id = @id
AND category IN (
select case when (@input1='Yes' AND @input2='Yes') then (select category from table where category in ('1','2'))
when (@input1='Yes' AND @input2='No') then (select category from table where category ='1')
when (@input1='No' AND @input2='Yes') then (select category from table where category ='2')
else ''
end as category)
END
输入值@ input1和@ input2是从另一个表中获取的,需要根据上述条件选择并输出类别为('1','2')的行。
我需要-
如果input1 =是并且input2 =是输出类别为('1','2')
的行如果input1 =是并且input2 =否输出类别为('1')的行
如果input1 =否并且input2 = Yes 输出类别为('2')的行
如果input1 = No和input2 = No 输出类别为('')的行
case语句输出多个值吗?需要帮助。
解决方法
请查看下面的代码,您无需使用CASE WHEN,只需使用条件组合即可解决问题。
create table [Test] ( id int,category nvarchar(10));
insert [Test] values(1,'1');
insert [Test] values(2,'2');
insert [Test] values(3,'1');
insert [Test] values(4,'2');
declare @input1 varchar(10) = 'Yes'
declare @input2 varchar(10) = 'No'
SELECT id,category
FROM [Test]
WHERE
(
( @input1 = 'Yes' and category ='1')
or
( @input2 = 'Yes' and category ='2')
)
,
也许是这样
SELECT id,category,column1,column2,column3
FROM table
WHERE id = @id
AND category IN
(
select category
from table
where
(
category = '1'
AND
@input1='Yes'
)
OR
(
category = '2'
AND
@input1='Yes'
)
)
或者这个:
SELECT id,column3
FROM table
WHERE id = @id
AND
(
(
@input1='Yes' AND @input2='Yes' AND category IN (select category from table where category in ('1','2')
)
OR
(
@input1='Yes' AND @input2='No' AND category IN (select category from table where category ='1')
)
OR
(
@input1='No' AND @input2='Yes' AND category IN (select category from table where category ='2')
)
)
,
我建议您形成一个映射表,并在SELECT查询中利用它。这样可以简化代码并提供更清晰的方法。
;WITH CTE_MappingTable AS
(
SELECT *
FROM
(
values
('Yes','Yes',1),('Yes',2),'No',('No',2)
) as t(input1,input2,category)
)
SELECT id,column3
FROM table as t
INNER JOIN CTE_MappingTable as c
ON c.Category = t.Category
WHERE id = @id AND c.input1 = @input1 AND c.input2 = @input2
,
如果您想使用in
,则可以使用:
where id = @id and
category in ( (case when @input1 = 'Yes' then 1 end),(case when @input2 = 'Yes' then 2 end)
)
case
的默认值为NULL
,这将使比较失败。
此外,请注意,我删除了'1'
和'2'
周围的单引号。这些看起来像数字,所以我假设category
是一个数字。引号只能用于字符串和日期常量。