Re: How to search for composite type array

From: ChoonSoo Park <luispark(at)gmail(dot)com>
To: David Johnston <polobo(at)yahoo(dot)com>
Cc: pgsql-general(at)postgresql(dot)org
Subject: Re: How to search for composite type array
Date: 2012-10-02 18:03:22
Message-ID: CACgbiFtBYoP5=5DNBURVmgCcR0WAiFyJHRPZpnvuWvhyE0HKug@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Thank you David,

unnest is the secret to this problem.

I appreciate your help.
-Choon Park

On Mon, Oct 1, 2012 at 6:56 PM, David Johnston <polobo(at)yahoo(dot)com> wrote:

> *From:* pgsql-general-owner(at)postgresql(dot)org [mailto:
> pgsql-general-owner(at)postgresql(dot)org] *On Behalf Of *ChoonSoo Park
> *Sent:* Monday, October 01, 2012 5:50 PM
> *To:* pgsql-general(at)postgresql(dot)org
> *Subject:* [GENERAL] How to search for composite type array****
>
> ** **
>
> Hello postgresql gurus,****
>
> ** **
>
> I want to have an array of composite type in a table. Retrieving/saving
> value work fine.****
>
> ****
>
> I just wonder how I can search against composite type array.****
>
> ** **
>
> CREATE TYPE CompXYZ AS (****
>
> attr1 integer,****
>
> attr2 text,****
>
> attr3 inet****
>
> );****
>
> ** **
>
> CREATE TABLE sample (****
>
> id integer not null primary key,****
>
> list CompXYZ[]****
>
> );****
>
> ** **
>
> insert into sample values (1, '{"(1,abc,127.0.0.1)", "(5,def,10.0.1.2)"}');
> ****
>
> insert into sample values (2, '{"(10,hello,127.0.0.1)",
> "(20,def,10.0.1.2)"}');****
>
> insert into sample values (3, '{"(20,hello,10.1.1.1)",
> "(30,there,10.1.1.2)"}');****
>
> ** **
>
> How I can search a row containing "hello" for attr2?****
>
> ** **
>
> I know if I have a separate table for saving 3 attributes along with
> foreign key to sample table, then I can achieve my goal.****
>
> I just want to know if there is a way to do the same thing using composite
> array.****
>
> ** **
>
> Thank you,****
>
> Choon Park****
>
> ** **
>
>
> =============================================================================
> ****
>
> ** **
>
> SELECT * FROM sample WHERE id IN (****
>
> SELECT id FROM (****
>
> SELECT id, unnest(list) AS list_item FROM sample****
>
> ) explode --need to unnest the array so you can address individual parts
> of the composite type in the where clause****
>
> WHERE (explode.list_item).text = ‘hello’ –note the () are required around
> (table.column), even if table is omitted; i.e., “(list_item).text”****
>
> ) --/IN****
>
> ** **
>
> In may be worth it to define a ****
>
> ** **
>
> text = CompXYZ ****
>
> ** **
>
> custom equality function+operator then you could do this (in theory…):****
>
> ** **
>
> … WHERE ‘hello’ = ANY(list)****
>
> ** **
>
> Your main issue is that the ANY/ALL array operators operating on whole
> elements.****
>
> ** **
>
> Tweak the above to output whatever specific data you need as written it
> outputs a single record from sample if any of the contained array elements
> matches.****
>
> ** **
>
> David J.****
>
> ** **
>

In response to

Browse pgsql-general by date

  From Date Subject
Next Message Chris McDonald 2012-10-02 18:42:59 stored procedure multiple call call question
Previous Message Hugo <Nabble> 2012-10-02 17:38:38 Re: Thousands of schemas and ANALYZE goes out of memory