【问题标题】:Error updating field conditionally in PostgreSQL-11在 PostgreSQL-11 中有条件地更新字段时出错
【发布时间】:2019-09-14 23:43:46
【问题描述】:

给定以下查询:

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”不明确第 28 行:WHEN offline_access_token == NULL

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

WHEN shopify_app_shops.offline_access_token == %(offline_access_token)s

我得到了这个错误:

失败:对表“shopify_app_shops”第 28 行的 FROM 子句条目的无效引用:何时 shopify_app_shops.offline_access_token == NULL

此时我不知所措!

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

表达式

分配给列的表达式。表达式可以使用该列和表中其他列的旧值。

那我做错了什么?

【问题讨论】:

    标签: postgresql sql-update conditional-statements expression postgresql-11


    【解决方案1】:

    使用表别名

    WHEN s.offline_access_token ...
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      • 1970-01-01
      • 2016-02-11
      • 1970-01-01
      相关资源
      最近更新 更多