Сгруппированный оператор IF в SQL

#sql

Вопрос:

Мои данные принимают такую базовую форму: (http://sqlfiddle.com /#!9/d4ae98/1)

 CREATE TABLE Table1
(`ID` int, `Type` varchar(1));

INSERT INTO Table1
(`ID`, `Type`)
VALUES
(123, 'A'),
(123, 'B'),
(123, 'C'),
(456, 'A'),
(789, 'A'),
(789, 'B')
;
 

Мне нужен третий столбец, который является true / false для каждой строки, в зависимости от того, имеет ли значение ID этой строки type=’B’ где-либо в данных. Таким образом, желаемый результат будет:

 ID   Type   V3
123  A      t
123  B      t
123  C      t
456  A      f
789  A      t
789  B      t
 

Каков наилучший способ сделать это? (И, да, я знаю, что язык сценариев, такой как R или Python, может легко сделать то, что я хочу здесь, но я хочу использовать этот вывод как предложение WITH в более крупном SQL-запросе.)

Ответ №1:

Вы можете сделать это с помощью регистра в Select:

 select *, CASE
WHEN id in (select id from table1 where type like '%B%') then 't'
ELSE 'f'
END V3
from table1;
 

Ссылка на скрипку: http://sqlfiddle.com /#!9/e47bc37/1

Ответ №2:

Может ли вам помочь подобное решение:

 with Table2 as (
select * from table1 where type ='B'
)
select t1.*, case t2.type when 'B' then 't' else 'f' end v3 from table1 t1 left 
outer join table2 t2 on t1.id = t2.id ;