首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgres Citus,不可变的日期转换

Postgres Citus,不可变的日期转换
EN

Stack Overflow用户
提问于 2022-02-15 20:24:52
回答 1查看 281关注 0票数 0

尝试以编程方式更新一些关于Citus的日期,我总是

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

从这样的查询中

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2022-04-25 13:12:28

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

代码语言:javascript
复制
select proname, pronamespace::regnamespace, provolatile
from pg_proc
where proname = 'concat';
 proname │ pronamespace │ provolatile
─────────┼──────────────┼─────────────
 concat  │ pg_catalog   │ s

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

因此,我认为这个查询应该有效:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71132925

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档