Ошибка условного обновления поля в PostgreSQL-11

Учитывая следующий запрос:

insert into shopify_app_shops as s
    (
        myshopify_name,
        hostname,
        user_status,
        offline_access_token,
        offline_access_token_updated_at,
        updated_at
    )
    values
    (
        %(myshopify_name)s,
        %(hostname)s,
        %(user_status)s,
        %(offline_access_token)s,
        now(),
        now()
    )
    on conflict (myshopify_name)
    do update
        set
            hostname=%(hostname)s,
            user_status=%(user_status)s,
            offline_access_token_updated_at =
            CASE
                WHEN offline_access_token == %(offline_access_token)s
                THEN offline_access_token_updated_at
                ELSE now()
            END,
            offline_access_token=%(offline_access_token)s,
            updated_at = now()
            returning myshopify_name
            ;

Я получаю сообщение об ошибке:

Ошибка: ссылка на столбец «offline_access_token» неоднозначна LINE 28: WHEN offline_access_token == NULL

Однако, если я полностью укажу поле, добавив имя таблицы следующим образом:

WHEN shopify_app_shops.offline_access_token == %(offline_access_token)s

Вместо этого я получаю эту ошибку:

Ошибка: неверная ссылка на запись FROM для таблицы "shopify_app_shops" LINE 28: WHEN shopify_app_shops.offline_access_token == NULL

На данный момент я в недоумении, что мне делать!

В документации для операторов обновления postgresql-11 четко указано, что выражение, используемое для set value может содержать ссылки на другие поля, чтобы получить доступ к старым значениям:

выражение

Выражение для присвоения столбцу. Выражение может использовать старые значения этого и других столбцов таблицы.

Так что я делаю неправильно?


person Lennart Rolland    schedule 14.09.2019    source источник


Ответы (1)


Используйте псевдоним таблицы

WHEN s.offline_access_token ...

Имя таблицы не отображается при использовании псевдонима. Не связано, вам, вероятно, следует использовать IS NOT DISTINCT FROM вместо ==.

person klin    schedule 15.09.2019