From: | Bryn Llewellyn <bryn(at)yugabyte(dot)com> |
---|---|
To: | Shaheed Haque <shaheedhaque(at)gmail(dot)com> |
Cc: | pgsql-general list <pgsql-general(at)lists(dot)postgresql(dot)org> |
Subject: | Re: Is it possible to index "deep" into a JSONB column? |
Date: | 2022-05-30 02:12:09 |
Message-ID: | 35E20612-C3AD-4150-A5F2-CE078C6C96E0@yugabyte.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general |
> shaheedhaque(at)gmail(dot)com wrote:
>
> Suppose I have a JSONB field called "snapshot". I can create a GIN
> index on it like this:
>
> create index idx1 on mytable using gin (snapshot);
>
> In principle, I believe this allows index-assisted access to keys and
> values nested in arrays and inner objects but in practice, it seems
> the planner "often" decides to ignore the index in favour of a table
> scan. (As discussed elsewhere, this is influenced by the number of
> rows, and possibly other criteria too).
>
> Now, I know it is possible to index inner objects, so that is snapshot
> looks like this:
>
> {
> "stuff": {},
> "more other stuff": {},
> "employee": {
> "1234": {"date_of_birth": "1970-01-01"},
> "56B789": {"date_of_birth": "1971-02-02"},
> }
> }
>
> I can say:
>
> create index idx2 on mytable using gin ((snapshot -> 'employee'));
>
> But what is the syntax to index only on date_of_birth? I assume a
> btree would work since it is a primitive value, but WHAT GOES HERE in
> this:
>
> create index idx3 on mytable using btree ((snapshot ->'employee' ->
> WHAT GOES HERE -> 'date_of_birth'));
>
> I believe an asterisk "*" would work if 'employee' was an array, but
> here it is nested object with keys. If it helps, the keys are
> invariably numbers (in quoted string form, as per JSON).
Try this:
snapshot -> ‘employee’->>’date_of_birth’
From | Date | Subject | |
---|---|---|---|
Next Message | Masahiko Sawada | 2022-05-30 06:52:29 | Re: Support logical replication of DDLs |
Previous Message | Rob Sargent | 2022-05-30 00:02:30 | Re: psql 15beta1 does not print notices on the console until transaction completes |