2015-01-07 14:36 GMT-02:00 Matheus de Oliveira <matioli.math...@gmail.com>:

>
> Isso já foi sugerido. E não funciona, pois ordenaria pelo "id" e não pelos
> elementos informados para o IN. No exemplo em questão, o valor "20" foje da
> ordem do "id".
>

Eu só consegui pensar numa *gambiarra* pra fazer funcionar dessa forma (com
a ordem dos filtros):

postgres=# create table foo( id serial primary key, name text);
CREATE TABLE
postgres=# insert into foo (name) select 'name ' || generate_series(1,100)
as name ;
INSERT 0 100


-- workaround starts
DROP SEQUENCE IF EXISTS temp_seq;
CREATE TEMP sequence temp_seq;
-- workaround ends

WITH items_parafiltrar as (
SELECT UNNEST(ARRAY[1,5,20,12]) AS filtro
), lista as (
SELECT nextval('temp_seq') As row_number, items_parafiltrar.filtro as item
FROM items_parafiltrar
)
SELECT foo.id, foo.name , lista.row_number FROM foo, lista
where foo.id = lista.item
order by lista.row_number;

e a saida:

postgres-# order by lista.row_number;order by lista.row_number;
 id |  name   | row_number
----+---------+------------
  1 | name 1  |          1
  5 | name 5  |          2
 20 | name 20 |          3
 12 | name 12 |          4
(4 rows)

Agora, minhas considerações:
1) pra que, OBRIGATORIAMENTE, tem que ser nessa ordem?
2) seria mais elegante fazer sem a sequence, mas a função de row_number
(das window functions) precisa de um ordem by e aí já bagunça nossa ordem
duvidosa.
3) não precisa ser um array com o filtro, mas convenhamos, é mais fácil
digitar no array do que ficar fazendo union dos registros. :P

Peguei a idéia desse link[1] pra fazer o row num sem o ordem by. Certamente
dá pra usar outra solução ou pensar em algo mais elegante.

[1]
http://www.postgresonline.com/journal/archives/79-Simulating-Row-Number-in-PostgreSQL-Pre-8.4.html


-- 
Sebastian Webber
http://swebber.me
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a