array sort for varchar arrays?

Started by Matthew Dennisalmost 18 years ago6 messagesgeneral
Jump to latest
#1Matthew Dennis
mdennis@merfer.net

I'm likely overlooking something, but I can't seem to find a function to
sort a varchar array. Something like "select sort('{y,z,x}'::varchar[])" =>
{'x','y','z'}.

#2Scott Bailey
artacus@comcast.net
In reply to: Matthew Dennis (#1)
Re: array sort for varchar arrays?

I'm likely overlooking something, but I can't seem to find a function to
sort a varchar array. Something like "select
sort('{y,z,x}'::varchar[])" => {'x','y','z'}.

You've got it right. On Pg 8.3.3 I get
SELECT sort(array['z','y','x']) -> {x,y,z}

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: Matthew Dennis (#1)
Re: array sort for varchar arrays?

2008/7/8 Matthew Dennis <mdennis@merfer.net>:

I'm likely overlooking something, but I can't seem to find a function to
sort a varchar array. Something like "select sort('{y,z,x}'::varchar[])" =>
{'x','y','z'}.

create function sort(anyarray)
returns anyarray as $$
select array(select $1[i] from generate_series(array_lower($1,1),
array_upper($1,1)) g(i) order by 1)
$$ language sql strict immutable;

postgres=# select sort(array[1,2,3,1]);
sort
-----------
{1,1,2,3}
(1 row)

postgres=# select sort(array['a','b','c','a']);
sort
-----------
{a,a,b,c}
(1 row)

Regards
Pavel Stehule

#4Scott Bailey
artacus@comcast.net
In reply to: Scott Bailey (#2)
Re: array sort for varchar arrays?

I'm likely overlooking something, but I can't seem to find a function
to sort a varchar array. Something like "select
sort('{y,z,x}'::varchar[])" => {'x','y','z'}.

You've got it right. On Pg 8.3.3 I get
SELECT sort(array['z','y','x']) -> {x,y,z}

Crap. There's a sort function included for int[]. I tried it on a
varchar[] and it worked, but that was because I had made a function that
was pretty much what pavel posted.

#5Matthew Dennis
mdennis@merfer.net
In reply to: Pavel Stehule (#3)
Re: array sort for varchar arrays?

On Wed, Jul 9, 2008 at 12:28 AM, Pavel Stehule <pavel.stehule@gmail.com>
wrote:

2008/7/8 Matthew Dennis <mdennis@merfer.net>:

I'm likely overlooking something, but I can't seem to find a function to
sort a varchar array. Something like "select sort('{y,z,x}'::varchar[])"

=>

{'x','y','z'}.

create function sort(anyarray)
returns anyarray as $$
select array(select $1[i] from generate_series(array_lower($1,1),
array_upper($1,1)) g(i) order by 1)
$$ language sql strict immutable;

postgres=# select sort(array[1,2,3,1]);
sort
-----------
{1,1,2,3}
(1 row)

postgres=# select sort(array['a','b','c','a']);
sort
-----------
{a,a,b,c}
(1 row)

Regards
Pavel Stehule

Thanks Pavel, I ended up writing a method pretty much like that. It seems
like that would be inefficient though (works ok for my use though). Does
anyone know if there are future plans to add an array_sort method?

#6Pavel Stehule
pavel.stehule@gmail.com
In reply to: Matthew Dennis (#5)
Re: array sort for varchar arrays?

2008/7/9 Matthew Dennis <mdennis@merfer.net>:

On Wed, Jul 9, 2008 at 12:28 AM, Pavel Stehule <pavel.stehule@gmail.com>
wrote:

2008/7/8 Matthew Dennis <mdennis@merfer.net>:

I'm likely overlooking something, but I can't seem to find a function to
sort a varchar array. Something like "select
sort('{y,z,x}'::varchar[])" =>
{'x','y','z'}.

create function sort(anyarray)
returns anyarray as $$
select array(select $1[i] from generate_series(array_lower($1,1),
array_upper($1,1)) g(i) order by 1)
$$ language sql strict immutable;

postgres=# select sort(array[1,2,3,1]);
sort
-----------
{1,1,2,3}
(1 row)

postgres=# select sort(array['a','b','c','a']);
sort
-----------
{a,a,b,c}
(1 row)

Regards
Pavel Stehule

Thanks Pavel, I ended up writing a method pretty much like that. It seems
like that would be inefficient though (works ok for my use though). Does
anyone know if there are future plans to add an array_sort method?

Hello,

I don't know about it. You should rewrite code from intarray contrib
module and modify it for varchars. With varchars it could be little
bit more work - maybe one day.

Regards
Pavel Stehule