2

PostgreSQL では、このクエリを実行します

SELECT "table".* FROM "table" WHERE "table"."column" IN (1, 5, 3)

常に結果を1, 5, 3順番に返しますか、それともあいまいですか?
あいまいな場合、結果が順序どおりであることを適切に保証するにはどうすればよい1, 5, 3ですか?

4

5 に答える 5

3

WHERE 句は結果を順序付けしません。一致するレコードを、データベース インデックスが見つけた順序で選択するだけです。

order by 句を追加する必要があります。

于 2013-04-23T23:12:41.573 に答える
2

真の前の偽の注文

SELECT "table".*
FROM "table"
WHERE "table"."column" IN (1, 5, 3)
order by
    "column" != 1,
    "column" != 5,
    "column" != 3
于 2013-04-23T23:19:17.123 に答える
2

selectステートメントに次のようなものを追加します

order by CASE WHEN "column"=1 THEN 1
              WHEN "column"=2 THEN 2
              ELSE 3
       END

3 つ以上の値がある場合は、ルックアップ テーブルを作成し、クエリでそれに結合する方が簡単な場合があります。

于 2013-04-23T23:19:39.583 に答える
1

セット自体は順序を知りません。SELECTクエリは、順序付けされた行を返す必要がありORDER BYます。

他の回答では、 のCASEステートメントまたはブール式が提案されていますORDER BYが、それはエレガントとはほど遠いものであり、大きなテーブルではかなり非効率的です。クエリのセットではなく、配列またはカンマ区切りの文字列を使用することをお勧めします。

特定のテーブルの場合:

CREATE TABLE tbl (col int);

配列を使用すると、次のように機能します。

SELECT col
FROM   tbl
JOIN  (
   SELECT col, row_number() OVER () AS rn
   FROM   unnest('{1,5,3}'::int[]) AS col
   ) u USING (col)
ORDER  BY rn;

入力配列のシーケンスで見つかったすべての行を返します。

-> SQLfiddle

詳細と将来性のあるコードについては、この密接に関連する質問を検討してください:
PostgreSQL unnest() with element number

または、dba.SE に関する対応する質問: ネスト
されていない配列内の要素の元の順序を保持する方法は?

于 2013-04-23T23:40:52.193 に答える