agora inbox for pgsql-ru-general@postgresql.org  
help / color / mirror / Atom feed
From: Maxim Boguk <mboguk@masterhost.ru>
To: pgsql-ru-general@postgresql.org
Subject: Re: [pgsql-ru-general] Re: [pgsql-ru-general] Сортировка в требуемом порядке
Date: Tue, 15 Mar 2011 21:11:53 +1300
Message-ID: <4D7F1F49.4040809@masterhost.ru> (raw)
In-Reply-To: <20110314191250.GF19356@apache.rbscorp.ru>
References: <E1Pz8dD-00012t-00.leopard_ne-inbox-ru@f261.mail.ru>
	<AANLkTi=dhU+g9NWEEpBS_fgWZHLynxXpAtiZTvEUEo=o@mail.gmail.com>
	<20110314191250.GF19356@apache.rbscorp.ru>

On 15/03/11 08:22, Dmitry E. Oboukhov wrote:
>
> DI>  14 марта 2011 г. 17:20 пользователь Олекс й Василь в<leopard_ne@inbox.ru>
> DI>  написал:
>
> DI>  Есть такой запрос:
> DI>  Select * from foo where catalog_id IN(2,3,6,1,4,66,44,23,45)
>
> DI>  Возможно ли вывести результат в таком же порядке, как и условие в IN,
> DI>  тоесть первый елемент с  catalog_id == 2, второй - catalog_id == 3, третий
> DI>  - catalog_id == 6, четвертый - catalog_id == 1 и т.д.
>
> DI>  Данную задачу можно решить, заменив IN на JOIN, например:
>
> DI>  dmitigr=>
> DI>  SELECT foo.* FROM (VALUES(1),(2),(3),(4),(6)) AS foo(catalog_id)
> DI>  JOIN (SELECT id.val, row_number() over() FROM (VALUES(3),(2),(6),(1),(4)) AS
> DI>  id(val)) AS id
> DI>  ON (foo.catalog_id = id.val) ORDER BY row_number;
> DI>  catalog_id
> DI>  ------------
> DI>  3
> DI>  2
> DI>  6
> DI>  1
> DI>  4
>
>
> кстати unnest как-то даже покороче выглядит
>
> SELECT
>      foo.*
>
> FROM
>      unnest('{3,2,6,1,4}'::int[]) idt
>
> JOIN
>      foo ON catalog_id = idt
>

Если оптимизатор выберет hashjoin или mergejoin вместо nested loop
то порядок результатов в выдаче будет произволен. Лучше не использовать 
такой подход.

PS: никакой запрос без order by не дает гарантированной сортировки. все 
ухищрения чтобы без этого обойтись или работают не всегда или могут 
перестать работать даже при смене минорной версии базы.

-- 
SY, Maxim Boguk



view thread (25+ messages)  latest in thread

Message-ID: <4D7F1F49.4040809@masterhost.ru>
Permalink:  ../4D7F1F49.4040809@masterhost.ru/
Also on:    postgresql.org/message-id/4D7F1F49.4040809@masterhost.ru

reply

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Reply to all the recipients using the --to and --cc options:
  reply via email

  To: pgsql-ru-general@postgresql.org
  Cc: mboguk@masterhost.ru
  Subject: Re: =?KOI8-R?Q?Re=3A_=5Bpgsql-ru-general=5D_Re=3A_=5Bpgsql-ru-?= =?KOI8-R?Q?general=5D_=F3=CF=D2=D4=C9=D2=CF=D7=CB=C1_=D7_=D4=D2=C5?= =?KOI8-R?Q?=C2=D5=C5=CD=CF=CD_=D0=CF=D2=D1=C4=CB=C5?=
  In-Reply-To: <4D7F1F49.4040809@masterhost.ru>

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox