We could use this function when we want to sort the list based on a given set of filter
Test data:
create table x_n as select x.y from (values(9),(13),(15),(30),(27),(63)) as x(y)
Test query:
select * from x_n where y in (15,9,13,27) order by find_in_set(y, '15,9,13,27')
Output:
15 9 13 27
Here's the find_in_set function for Postgres:
create function find_in_set(n int, s text) returns bigint as $$ select z.row_number from ( select row_number() over(), y.x from (select unnest(('{' || $2 || '}')::int[]) as x) as y ) as z where z.x = $1 $$ language sql;
Here's the function for pre-8.4:
create function find_in_set(n int, s text) returns bigint as $$ declare a int[]; begin a = ('{' || $2 || '}')::int[]; return ( select i from generate_series(1, array_upper(a, 1)) as gs(i) where a[i] = $1 ); end; $$ language 'plpgsql';
Awesome, thanks a lot for this. I am using it in my project and it was just what I needed :)
ReplyDelete