postgresql - 在 PostgreSQL-11 中有条件地更新字段时出错

标签 postgresql sql-update conditional-statements expression 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
            ;

我得到错误:

Failed with: column reference "offline_access_token" is ambiguous LINE 28: WHEN offline_access_token == NULL

但是,如果我通过像这样在表名前添加来完全指定字段:

WHEN shopify_app_shops.offline_access_token == %(offline_access_token)s

我反而得到这个错误:

Failed with: invalid reference to FROM-clause entry for table "shopify_app_shops" LINE 28: WHEN shopify_app_shops.offline_access_token == NULL

此时我不知所措!

documentation for postgresql-11 update statements明确指出用于设置值的表达式可以包含对其他字段的引用以访问旧值:

expression

An expression to assign to the column. The expression can use the old values of this and other columns in the table.

那我做错了什么?

最佳答案

使用表别名

WHEN s.offline_access_token ...

使用别名时表名不可见。不相关,您可能应该使用 IS NOT DISTINCT FROM而不是 ==

关于postgresql - 在 PostgreSQL-11 中有条件地更新字段时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57940077/

相关文章:

linux - 将 postgres DB 从 Heroku 移动到 Azure 托管的基于 Linux 的 VM(Django 应用程序)所需的步骤

php - 使用空变量/值更新 MySQLi

java - 无法更新 android sqlite 中的行

mysql - 为什么我在更新 sql 时遇到这个 MySql 错误

python - 条件语句在我的 Python 代码中不起作用

python - Django 测试——无法删除并重新创建测试数据库

postgresql - 使用窗口函数在 Postgresql 中进行数据分区

postgresql - 从 plpgsql 中的 FOR 循环切换到基于集合的 SQL 命令

javascript - 我怎样才能找到默认为 true 的条件?

python - 用中值替换 numpy 数组中的零