Postgres, как избежать повторения, если затем в операторе select - PullRequest
0 голосов
/ 02 мая 2018

Какой самый простой способ объединить несколько столбцов таблицы для настройки переменных для другого запроса?

Я хочу избегать постоянного повторения одних и тех же операторов if в моем запросе

SELECT 
CASE
WHEN team_id = away_team_id THEN away_score * 5
WHEN team_id = home_team_id THEN home_score * 5
END AS team_score_times_five, 
CASE
WHEN team_id = away_team_id THEN away_score - 5
WHEN team_id = home_team_id THEN home_score - 5
END AS team_score_minus_five
FROM t1

Вместо этого я бы предпочел установить одну переменную

CASE
WHEN team_id = away_team_id THEN away_score
WHEN team_id = home_team_id THEN home_score
END AS team_score

, а затем запросить его более аккуратно

SELECT team_score * 5 AS team_score_times_five, team_score - 5 AS team_score_minus_five FROM t1

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы также можете попробовать общие табличные выражения :

WITH common_table_expression AS (
    SELECT 
        CASE
          WHEN team_id = away_team_id THEN away_score
          WHEN team_id = home_team_id THEN home_score
          END AS team_score
    FROM t1
)
SELECT 
      team_score * 5 AS team_score_times_five
    , team_score - 5 AS team_score_minus_five
FROM common_table_expression

CTE позволяют вам составлять несколько запросов, которые будут вложены таким образом, чтобы они были более удобочитаемыми и легче изменялись в будущем (в зависимости от ситуации), если изменяются требования бизнеса.

В этой статье есть большой раздел, озаглавленный «Использование общих табличных выражений для чрезвычайно удобочитаемого SQL», в котором приводятся дополнительные аргументы о том, почему вы хотите использовать CTE.

0 голосов
/ 02 мая 2018

Просто используйте подзапрос за FROM

 SELECT team_score * 5 AS team_score_times_five, 
        team_score - 5 AS team_score_minus_five
 FROM (
   SELECT CASE
     WHEN team_id = away_team_id THEN away_score
     ELSE home_score END AS team_score
   FROM t1
 ) t
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...