@illaaa

Как объединить «in» и «case»?

Я могу написать такой предикат в where
select *
from customer
inner join documents on documents.customer_id = customer_id
where customer.type = case ... end

С конструкцией "in" так не работает, каким иным способом это можно реализовать?
Нужно, чтобы в зависимости от типа пользователя возвращались разные группы документов
select *
from customer
inner join documents on documents.customer_id = customer_id
where documents.id in case when customer.type = 'A' then (1,2,3) when customer.type = 'B' then (3,5,6) end


В результате у меня должно получиться что-то вроде этого:

customer1 - customer_typeA - document1
customer1 - customer_typeA - document2
customer1 - customer_typeA - document3

customer2 - customer_typeB - document3
customer2 - customer_typeB - document5
customer2 - customer_typeB - document6
  • Вопрос задан
  • 132 просмотра
Решения вопроса 2
@d-stream
Готовые решения - не подаю, но...
in подразумевает список
case - подразумевает единственное значение

можно конечно извратиться и сделать нечто типа ... in (case...end) но зачем?
Ответ написан
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
DECLARE @customer TABLE ( ID INT, [Name] VARCHAR(100), [Type] VARCHAR(10))
DECLARE @documents TABLE ( ID INT IDENTITY, [Type] VARCHAR(100), CustomerID INT )
INSERT INTO @customer VALUES (1, 'Олег','ФОП'),
(2, 'Женя','Юр.лицо'),
(3, 'Таня','Физ.лицо'),
(4, 'Коля','Физ.лицо')
INSERT INTO @documents VALUES ('паспорт', 1),
('инн', 1),
('загран',1),
('паспорт',2),
('инн',2),
('загран',2),
('паспорт',3),
('инн',3),
('загран',3),
('паспорт',4),
('инн',4),
('загран',4)

SELECT * FROM @customer AS Customer
  LEFT JOIN @documents AS Document ON  CustomerID = Customer.ID
  WHERE Customer.[Type] = 'Физ.лицо' AND Document.[Type] IN ('паспорт','инн','загран')
UNION
SELECT * FROM @customer AS Customer
  LEFT JOIN @documents AS Document ON CustomerID = Customer.ID
  WHERE Customer.[Type] <> 'Физ.лицо' AND Document.[Type] IN ('паспорт', 'инн' )
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы