开发者社区> 问答> 正文

postgresql 给date_part创建索引,提示ERROR: functions in index expression must be marked IMMUTABLE

已解决

我的jsonb字段里,内容如{name:“aaa“,data:“2017-12-12”}
我现在想给这个date字段创建索引,结果提示
ERROR: functions in index expression must be marked IMMUTABLE

我查询代码如下:
create index item_date_year on item using btree((date_part('year'::text,(myjsonb ->> 'date')::date)));

我看过date_part这个函数,是稳定的函数(IMMUTABLE)
我在表里单独建立一个字段保存date并建立索引就没问题。

请问是哪里的问题?

postgresql版本9.6

展开
收起
完美的爱 2017-10-17 19:05:49 5793 0
1 条回答
写回答
取消 提交回答
  • 采纳回答

    自己暂时解决了,问题出在::date转换上,把jsonb里的date字符串转成date格式,内置的方法,均不是immutable属性(稳定属性),所以不允许建立索引。包括to_date()函数。
    解决办法:自己按照内置的to_date()函数,改一个to_date_immutable()函数。
    然后给to_date_immutable()函数immutable属性。
    然后用自己的to_date_immutable()函数转换格式。就可以创建索引了。

    虽然官方不建议在非immutable属性上强行索引,但是为了解决问题。。。没办法了
    谁有更好的办法,可以留言哈~!

    创建函数代码:

    CREATE OR REPLACE FUNCTION to_date_immutable(
        text,
        text)
      RETURNS date AS
    'to_date'
      LANGUAGE internal immutable STRICT
      COST 1;
    ALTER FUNCTION to_date_immutable(text, text)
      OWNER TO postgres;
    COMMENT ON FUNCTION to_date_immutable(text, text) IS 'convert text to date';

    建立索引代码:

    create index item_date_idx on item using btree((to_date_immutable(info_bak->>'release_date','yyyy-mm-dd')));
    2019-07-17 21:39:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖大会:开源 PolarDB 架构演进、关键技术与社区建设 立即下载
2023云栖大会:和客户一起玩转PolarDB新特性 立即下载
2023云栖大会:PolarDB for AI 立即下载

相关镜像