Как использовать значение после "as" в запросе SQL? - PullRequest
0 голосов
/ 19 июня 2020

Вот мой SQL запрос на PostgreSQL datatable

select main_bundle_statuses.status from (
    select main_bundle.status,
    row_number() over
    (partition by main_bundle.client_id order by main_bundle.created desc)
    as rnum
    from bundle main_bundle
    join config_dependence cd on cd.main_config_id = main_bundle.config_bundle_id
    where cd.dependent_config_id = b.config_bundle_id
    and main_bundle.client_id = b.client_id) main_bundle_statuses
where main_bundle_statuses.rnum = 1) as main_bundle_status,

Мне нужно проверить нулевое значение main_bundle_status в качестве второго столбца. Я пытался написать это:

(case
when main_bundle_status is null then true
else false
end) as dependent

Но у меня возникла ошибка. Как я могу проверить значение - нулевое оно или нет, и вернуть его как зависимое?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

main_bundle_status - это не поле, которое вы можете проверить, это псевдоним подзапроса, который содержит другой подзапрос, и я думаю, вы пропустили '(' в начале.

У вас есть два варианта: - сохранить его значение во временной таблице, а затем проверьте его с помощью CASE WHEN во втором запросе

  • в CASE WHEN вместо main_bundle_status напишите весь подзапрос, это будет примерно так:

    (select main_bundle_statuses.status from (
    select main_bundle.status,
    row_number() over
    (partition by main_bundle.client_id order by main_bundle.created desc)
    as rnum
    from bundle main_bundle
    join config_dependence cd on cd.main_config_id =main_bundle.config_bundle_id
    where cd.dependent_config_id = b.config_bundle_id
    and main_bundle.client_id = b.client_id) main_bundle_statuses
    where main_bundle_statuses.rnum = 1) as main_bundle_status,
    CASE WHEN (select main_bundle_statuses.status from (
    select main_bundle.status,
    row_number() over
    (partition by main_bundle.client_id order by main_bundle.created desc)
    as rnum
    from bundle main_bundle
    join config_dependence cd on cd.main_config_id =main_bundle.config_bundle_id
    where cd.dependent_config_id = b.config_bundle_id
    and main_bundle.client_id = b.client_id) main_bundle_statuses
    where main_bundle_statuses.rnum = 1) is null then true else false end as dependent
    

Поскольку в конце стоит запятая, я думаю, что это часть более крупного запроса и, как указано @GordonLinoff, это уже немного сбивает с толку. Я предлагаю решение для временной таблицы.

1 голос
/ 19 июня 2020

Поместите where в запрос external :

select . . . 
from ( . . . ) main_bundle_status
where main_bundle_statuses.rnum = 1;

Ваши условия join выглядят испорченными. DISTINCT ON - лучшая альтернатива. Я предполагаю что-то вроде этого:

select distinct on (b.client_id) b.status,
from bundle b join
     config_dependence cd
     on cd.main_config_id = b.config_bundle_id and
        cd.dependent_config_id = b.dependent_config_bundle_id and
        cd.client_id = b.client_id
order by b.client_id, b.created desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...