#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