+1
create index on test (((i).id)); ANALYZE explain select * from test where (i).id = 8909; QUERY PLAN ------------------------------------------------------------------------- Index Scan using test_id_idx on test (cost=0.43..8.45 rows=1 width=34) Index Cond: ((i).id = 8909) (2 rows) From: pgsql-general-ow...@postgresql.org [mailto:pgsql-general-ow...@postgresql.org] On Behalf Of Jeff Janes Sent: Montag, 29. Juni 2015 08:42 To: Shujie Shang Cc: John R Pierce; PostgreSQL mailing lists Subject: Re: [GENERAL] create index on a field of udt On Sun, Jun 28, 2015 at 10:31 PM, Shujie Shang <ssh...@pivotal.io <mailto:ssh...@pivotal.io> > wrote: Oh, I didn't explain my question well, actually I want to create an index on an udt in a table. e.g. create type info as (id int, name text); creat table test (i info); I want to run: create index myindex on test (i.id <http://i.id> ) It is a matter of finding the correct level of magic parentheses. create index on test (((i).id)); The outer layer are always needed for creating indexes. The middle layer are needed because you are indexing an expression, not a column. And the inner layer is needed because, well, that is just how udt works. Cheers, Jeff