Received: from maia.hub.org (maia-3.hub.org [200.46.204.243]) by mail.postgresql.org (Postfix) with ESMTP id B9A981337BF0 for ; Tue, 15 Mar 2011 05:18:51 -0300 (ADT) Received: from mail.postgresql.org ([200.46.204.86]) by maia.hub.org (mx1.hub.org [200.46.204.243]) (amavisd-maia, port 10024) with ESMTP id 77553-05 for ; Tue, 15 Mar 2011 08:18:44 +0000 (UTC) X-Greylist: delayed 00:06:40.065238 by SQLgrey-1.7.6 Received: from csmtp-2.masterhost.ru (csmtp1.masterhost.ru [83.222.22.203]) by mail.postgresql.org (Postfix) with SMTP id 4C0E81337B58 for ; Tue, 15 Mar 2011 05:18:43 -0300 (ADT) Received: (qmail 59568 invoked from network); 15 Mar 2011 08:12:00 -0000 Received: from unknown (HELO ?192.168.1.65?) (mboguk@masterhost.ru@121.98.213.188) by csmtp1.masterhost.ru with SMTP; 15 Mar 2011 08:12:00 -0000 Message-ID: <4D7F1F49.4040809@masterhost.ru> Date: Tue, 15 Mar 2011 21:11:53 +1300 From: Maxim Boguk User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.2.15) Gecko/20110303 Thunderbird/3.1.9 MIME-Version: 1.0 To: pgsql-ru-general@postgresql.org Subject: =?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?= References: <20110314191250.GF19356@apache.rbscorp.ru> In-Reply-To: <20110314191250.GF19356@apache.rbscorp.ru> Content-Type: text/plain; charset=KOI8-R; format=flowed Content-Transfer-Encoding: 8bit X-Virus-Scanned: Maia Mailguard 1.0.1 X-Spam-Status: No, hits=3.062 tagged_above=-10 required=5 tests=BAYES_50=0.8, FSL_RU_URL=2.271, RFC_ABUSE_POST=0.001, T_RP_MATCHES_RCVD=-0.01 X-Spam-Level: *** X-Archive-Number: 201103/78 X-Sequence-Number: 1210 On 15/03/11 08:22, Dmitry E. Oboukhov wrote: > > DI> 14 марта 2011 г. 17:20 пользователь Олекс й Василь в > 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