#postgresql #case-when
Вопрос:
У меня есть несколько путей, которые кому-то нужно проследить в зависимости от их выбора: по умолчанию, Сзади, Спереди, Мобильный.
Если человек выбирает обратный путь, он должен следовать по пути по умолчанию обратный путь.
Таблица должна быть такой:
CODE PATH
A1 DEFAULT
A2 DEFAULT
A3 DEFAULT
B1 BACK
B2 BACK
D3 BACK
C2 FRONT
C4 FRONT
E2 MOBILE
E5 MOBILE
Результат, который мне нужен в случае, когда (это должен быть случай, когда, потому что я запрашиваю в Google Data Studio, поэтому я не могу использовать предложение where), выглядит следующим образом:
CODE PATH
A1 BACK
A2 BACK
A3 BACK
B1 BACK
B2 BACK
D3 BACK
A1 FRONT
A2 FRONT
A3 FRONT
C2 FRONT
C4 FRONT
A1 MOBILE
A2 MOBILE
A3 MOBILE
E2 MOBILE
E5 MOBILE
Я попробовал этот запрос, но он не сработал.
CASE
WHEN PATH IN ('DEFAULT', 'BACK') THEN 'BACK'
WHEN PATH IN ('DEFAULT', 'FRONT') THEN 'FRONT'
WHEN PATH IN ('DEFAULT, ' MOBILE') THEN 'MOBILE'
ELSE NULL
END
Есть какие-нибудь зацепки?
Комментарии:
1. Мне не совсем понятно, как дублировались коды — у нас есть A1, A2, A3, у каждого из которых есть ЗАДНЯЯ, ПЕРЕДНЯЯ и МОБИЛЬНАЯ части?
2. Коды не дублировались. Но это то, чего я хотел бы в результате.
3. В исходной таблице у вас была только одна строка с A1, в ожидаемом результате у вас их три. Для меня это дублирование. И я не понимаю правил для этого, или какое это имеет отношение к вашему
case
заявлению.4. Точно. Я хочу дублировать результаты, но я не знаю, возможно ли это.
Ответ №1:
Вам понадобится либо
SELECT code, 'BACK' AS path FROM example WHERE path IN ('DEFAULT', 'BACK')
UNION ALL
SELECT code, 'FRONT' AS path FROM example WHERE path IN ('DEFAULT', 'FRONT')
UNION ALL
SELECT code, 'MOBILE' AS path FROM example WHERE path IN ('DEFAULT', 'MOBILE')
или
SELECT
code,
UNNEST(CASE path
WHEN 'DEFAULT' THEN ARRAY['BACK', 'FRONT', 'MOBILE']
ELSE ARRAY[path]
END) AS path
FROM example
или (может быть, самый приятный)
SELECT
code,
trail.result
FROM example
CROSS JOIN (VALUES
('DEFAULT', 'BACK'),
('BACK', 'BACK'),
('DEFAULT', 'FRONT'),
('FRONT', 'FRONT'),
('DEFAULT', 'MOBILE'),
('MOBILE', 'MOBILE')
) AS trail(path, result) USING (path)
Вы не можете добиться такого дублирования строк только с CASE
помощью выражения.