Как выбрать несколько разных столбцов и объединений в запросе в зависимости от значения другого столбца? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть довольно сложный запрос к таблице A, где JOIN делается для других таблиц B и C (и даже больше).

Мне бы хотелось, чтобы для определенного значения поля в таблице A поля добавлялись к SELECT, но также к другим соединениям.

Я знаю, что я могу динамически добавлять столбцы с помощью CASE, но проверенное значение всегда одинаково, и я бы хотел избежать повторения CASE для каждого поля, поскольку существует много полей. (Для ясности я назвал таблицы "B" и "D" в CASE, но в реальной ситуации это может быть то же самое с псевдонимом соединения)

SELECT
  CASE
    WHEN A.a1=1 THEN B.b1
    WHEN A.a1=2 THEN D.d1
  END AS a2,
  CASE
    WHEN A.a1=1 THEN B.b2
    WHEN A.a1=2 THEN D.d2
  END AS a3,
  CASE
    WHEN A.a1=1 THEN B.b2
    WHEN A.a1=2 THEN D.d2
  END AS a3,
  //... many others on different tables but always on the same condition
FROM A
  JOIN //?? if first condition join on B and C else on D and E

Есть ли решение для динамического присоединения и избежания такого длительного повторения вызовов CASE?

ПРИМЕЧАНИЕ: это только часть запроса, построенного с кодом, что затрудняет использование UNION, так как поля добавляются в другом месте, и будет трудно сопоставить то же количество выбранных полей.

1 Ответ

1 голос
/ 21 мая 2019

Вы можете использовать все LEFT JOIN с текущими CASE условиями как часть ON, а затем COALESCE значений этих таблиц.Что-то вроде:

      SELECT COALESCE(B.b1,D.d1) AS a2,
             COALESCE(B.b2,D.d2) AS a3,
             COALESCE(B.b3,D.d3) AS a4,
             ...
        FROM A
   LEFT JOIN B ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN C ON {normal_join_condition} AND A.a1 = 1
   LEFT JOIN D ON {normal_join_condition} AND A.a1 = 2
   LEFT JOIN E ON {normal_join_condition} AND A.a1 = 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...