在SQL中使用case语句获取多行作为输出

问题描述

我有一张桌子,

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是一个数字。引号只能用于字符串和日期常量。