alexey_bille
@alexey_bille
Web developer

Как добавить столбец на основе динамического столбца?

Пример простой для упрощения понимания вопроса, в реальном запросе трудно будет просто написать value + 20.

Допустим есть таблица table

id | value |
-------------
1 | 20 |
2 | 30 |

Запрос:
SELECT id, value, value + 10 as value1, value1 + 10 as value2
FROM table;

Реальный запрос
(SQL: select "articles".*, (select count(*) from "tags" inner join "articles_tags_map" on "tags"."id" = "articles_tags_map"."tag_id" where "articles"."id" = "articles_tags_map"."article_id" and "tags"."title" = tag) as "tags_count", 
CASE 
    WHEN articles.date > now() - interval '1 day' THEN 5 
    WHEN articles.date > now() - interval '1 week' THEN 3 
    WHEN articles.date > now() - interval '1 year' THEN 1 
    ELSE 0 
END * 10 as date_value
            , date_value + tags_count as test from "articles" where exists (select * from "tags" inner join "articles_tags_map" on "tags"."id" = "articles_tags_map"."tag_id" where "articles"."id" = "articles_tags_map"."article_id" and "tags"."title" = tag)


Ошибка: Undefined column: 7 ERROR: column "date_value" does not exist


Ошибка: ERROR: column "value1" does not exist

Можно ли как-то сделать этот запрос рабочим?
  • Вопрос задан
  • 297 просмотров
Пригласить эксперта
Ответы на вопрос 3
alexey_bille
@alexey_bille Автор вопроса
Web developer
Я задал тот же вопрос на stackoverflow
Ответ написан
Комментировать
@ponaehal
ИМХО (не проверял):
CASE... END * 10 as date_value, date_value + tags_count as test
Вы обзываете столбец и пытаетесь этот алиас тут же использовать. Видимо именно это не нравится интерпретатору.

Сработает так:

1. SELECT date_value, date _value*tags_count FROM (SELECT CASE... END as date_value , tags_count FROM "articles" ....)

или так:
2. SELECT
CASE ... END as date value,
CASE .... END *tags_count as date_value2
FROM "articles" ....
Ответ написан
Комментировать
@kylemaclohlan
WITH table1 (id, value) AS (VALUES (1, 10),(2, 20))
SELECT id
  , value
  , l.value1      AS value1
  , l.value1 + 10 AS value2
FROM table1
JOIN LATERAL (SELECT value + 10 AS value1) l ON TRUE
;
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы