Получение нескольких строк в качестве выходных данных с помощью оператора case в sql

#sql #sql-server #asp.net-mvc #tsql #case

#sql #sql-сервер #asp.net-mvc #tsql #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= Yes и input2 = Yes, выводите строки с категорией в (‘1’, ‘2’)

если input1 = Yes и input2 = Нет выходных строк с категорией в (‘1’)

если input1 = Нет и input2 = Да, выводите строки с категорией в (‘2’)

если input1 = Нет и input2 = нет выходных строк с категорией в («)

Выводит ли оператор case несколько значений? Нужна помощь.

Комментарии:

1. К вашему сведению, это выражение case, а не оператор.

2.«Выводит ли оператор case несколько значений?»Чтобы ответить на этот вопрос, CASE выражение возвращает скалярное значение.

3. Можем ли мы использовать альтернативу case здесь?

4. @EERS2 . . . В вашем примере данных id является уникальным, поэтому второе сравнение category не требуется.

Ответ №1:

ознакомьтесь с приведенным ниже кодом, вам не нужно использовать CASE WHEN, просто используйте where комбинации условий.

 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')
    )
  

Ответ №2:

Если вы хотите использовать in , вы можете использовать:

 where id = @id and
      category in ( (case when @input1 = 'Yes' then 1 end),
                    (case when @input2 = 'Yes' then 2 end)
                  )
  

Значение по умолчанию для case is NULL и это приведет к сбою любого сравнения.

Также обратите внимание, что я удалил одинарные кавычки вокруг '1' и '2' . Они выглядят как числа, поэтому я предполагаю, что category это число. Кавычки следует использовать только вокруг констант string и date.

Ответ №3:

Может быть, это:

 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, category, column1, column2, 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')
    )
)
  

Ответ №4:

Я бы посоветовал вам сформировать таблицу сопоставления и использовать ее в запросе SELECT. Это приведет к упрощению кода и более понятному подходу.

 ;WITH CTE_MappingTable AS
(
SELECT *
FROM
(
values
('Yes','Yes',1),
('Yes','Yes',2),
('Yes','No',1),
('No','Yes',2)
) as t(input1,input2,category)
)
SELECT id, category, column1, column2, 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