Re: How to build a btree index with integer values on jsonb data?

From: Andrew Gierth <andrew(at)tao11(dot)riddles(dot)org(dot)uk>
To: Johann Spies <johann(dot)spies(at)gmail(dot)com>
Cc: "pgsql-general\(at)postgresql(dot)org" <pgsql-general(at)postgresql(dot)org>
Subject: Re: How to build a btree index with integer values on jsonb data?
Date: 2018-12-13 09:03:02
Message-ID: 87va3x24c4.fsf@news-spur.riddles.org.uk
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

>>>>> "Johann" == Johann Spies <johann(dot)spies(at)gmail(dot)com> writes:

Johann> How can I transform the following definition to index pubyear
Johann> as integer and not text?

Johann> CREATE INDEX pubyear_idx
Johann> ON some_table_where_data_field_is_of_type_jsonb USING btree
Johann> ((((((data -> 'REC'::text) -> 'static_data'::text) ->
Johann> 'summary'::text) -> 'pub_info'::text) ->> '@pubyear'::text) COLLATE
Johann> pg_catalog."default");

Johann> While I can cast the value in a SELECT statement to integer I
Johann> have been able to do the same while creating the index.

Laurenz' answer was almost correct, just got the position of the parens
wrong.

When you use an expression in an index, the outermost level of the
expression must either be (syntactically) a function call, or it must
have parens around its _outermost_ level.

You can simplify selecting from nested json using #>> in place of the ->
and ->> operators. (x #>> array['foo','bar']) is equivalent to doing
((x -> 'foo') ->> 'bar')

So:

CREATE INDEX pubyear_idx
ON some_table_where_data_field_is_of_type_jsonb USING btree
(
((data #>> array['REC','static_data','summary','pub_info','@pubyear'])::integer)
);

Note the ::integer is inside the parens that define the column value
within the outermost ( ) which enclose the column _list_.

--
Andrew (irc:RhodiumToad)

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Johann Spies 2018-12-13 10:09:53 Re: How to build a btree index with integer values on jsonb data?
Previous Message Achilleas Mantzios 2018-12-13 08:56:27 Re: why would postgres be throttling a streaming replication slot's sending?