我的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
自己暂时解决了,问题出在::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')));
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。