Re: array_length(anyarray)

From: Merlin Moncure <mmoncure(at)gmail(dot)com>
To: Florian Pflug <fgp(at)phlo(dot)org>
Cc: Marko Tiikkaja <marko(at)joh(dot)to>, Dean Rasheed <dean(dot)a(dot)rasheed(at)gmail(dot)com>, Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>, David Fetter <david(at)fetter(dot)org>, PostGreSql hackers <pgsql-hackers(at)postgresql(dot)org>
Subject: Re: array_length(anyarray)
Date: 2014-01-10 14:10:00
Message-ID: CAHyXU0wn6fntp0J9Rq90z3CM2Kk-DgSrk5j3=CGb-BibBnX+5g@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Fri, Jan 10, 2014 at 6:00 AM, Florian Pflug <fgp(at)phlo(dot)org> wrote:
> On Jan10, 2014, at 11:00 , Merlin Moncure <mmoncure(at)gmail(dot)com> wrote:
>> On Fri, Jan 10, 2014 at 3:52 AM, Marko Tiikkaja <marko(at)joh(dot)to> wrote:
>>> On 1/10/14, 10:41 AM, Merlin Moncure wrote:
>>>>
>>>> What's needed for better iteration support (IMO)
>>>> is a function that does what unnest does but returns an array on
>>>> indexes (one per dimsension) -- a generalization of the
>>>> _pg_expandarray function. Lets' say 'unnest_dims'.
>>>
>>>
>>> So unnest_dims('{{1,2},{3,4}}'::int[]) would return VALUES (1,
>>> '{1,2}'::int[]), (2, '{3,4}'::int[])? If so, then yes, that's a
>>> functionality I've considered us to have been missing for a long time.
>>
>> not quite. it returns int[], anyelement: so, using your example, you'd get:
>>
>> [1,1], 1
>> [1,2], 2
>> [2,1], 3
>> [2,2], 4
>
> Now that we have WITH ORDINALITY, it'd be sufficient to have a
> variant of array_dims() that returns int[][] instead of text, say
> array_dimsarray(). Your unnest_dims could then be written as
>
> unnest(array_dimsarray(array)) with ordinality

hm, not quite following that. maybe an example?

my issue with 'WITH ORDINALITY' (while it's pretty neat) is that it
doesn't give you the dimension coordinate of each datum so you can't
really use it to slice. with unnest_dims(), you an slice, say via:

select array_agg(value) from (unnest_dims('{{1,2},{3,4}}'::int[])
group by dims[1];
or
select array_agg(value) from (unnest_dims('{{1,2},{3,4}}'::int[])
where dims[1] = 2;

not super elegant, but good enough for most uses I think. anyways,
getting back on topic, the question on the table is cardinality() vs
array_length, right?

merlin

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Kadri Raudsepp 2014-01-10 14:31:48 Column missing from pg_statistics
Previous Message Florian Pflug 2014-01-10 12:49:31 Re: [PATCH] Negative Transition Aggregate Functions (WIP)