СЛУЧАЙ, КОГДА ПРОБЛЕМА: одна и та же часть условия для нескольких условий

#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 помощью выражения.