【问题标题】:Postgres Citus, immutable date conversionPostgres Citus,不可变日期转换
【发布时间】:2022-04-25 21:12:28
【问题描述】:

尝试在 Citus 上以编程方式更新一些日期,我总是得到

[0A000] ERROR: STABLE functions used in UPDATE queries cannot be called with column references

来自类似的查询

UPDATE date_container SET json_value = json_value::jsonb - 'created_time' || CONCAT('{"created_time":"',
                                     rtrim(replace(to_timestamp(((json_value->>'created_time')::numeric/1000000))::text,' ','T'), '-05'),'"}')::jsonb

理论上所有方法都是immutable,但由于某些原因它说它的某些部分不是。

我还尝试了以下所有方法: PostgreSQL: how to convert from Unix epoch to date?

【问题讨论】:

  • 问题是从timestamp with time zonetext 的隐式转换,因为您使用它作为replace 的参数。
  • @LaurenzAlbe,有解决方案的想法吗?我尝试了很多可能的组合
  • 我试图理解这个查询,但这对我来说毫无意义。 - 应该做什么?,尝试将字符串 created_timejsonb 连接起来是什么?
  • @LaurenzAlbe 的目标是更新 jsonb created_time 字段。为此,据我了解,我必须将其删除并通过该代码再次插入。

标签: postgresql immutability citus


【解决方案1】:

CONCAT 函数是 stable 而不是 immutable,这通常是使用 any/anyelement 作为参数的函数的情况。

select proname, pronamespace::regnamespace, provolatile
from pg_proc
where proname = 'concat';
 proname │ pronamespace │ provolatile
─────────┼──────────────┼─────────────
 concat  │ pg_catalog   │ s

相反,您应该能够使用字符串连接运算符||,但一定要将所有项目转换为文本,否则使用|| 运算符的anyelement 版本可能会遇到同样的问题。

所以我认为这个查询应该有效:

UPDATE date_container SET json_value = json_value::jsonb - 'created_time' ||
   (
      '{"created_time":"'::text
      || rtrim(replace(to_timestamp(((json_value->>'created_time')::numeric/1000000))::text,' ','T'), '-05')::text
      || '"}'::text
   )::jsonb

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2022-01-09
    • 2018-09-25
    • 2019-05-26
    • 2020-07-04
    • 1970-01-01
    • 2016-10-05
    相关资源
    最近更新 更多