5

わかりました、これを行う方法についていくつかの答えがあります。ただし、すべての回答は、クエリがすべてを選択していることを前提としています。個別の選択がある場合、メソッドは機能しなくなります。

その方法については、こちらを参照してください: Postgresql での MySQL の ORDER BY FIELD() のシミュレート

基本的に私は持っています

SELECT DISTINCT id 
FROM items 
WHERE id IN (5,2,9) 
ORDER BY
 CASE id
  WHEN 5 THEN 1 
  WHEN 2 THEN 2
  WHEN 9 THEN 3
 END

もちろん、これは壊れて言います

「PGError: エラー: SELECT DISTINCT の場合、ORDER BY 式は選択リストに表示する必要があります」

IN 句の値の順序で PostgreSQL のクエリ結果を並べ替える方法はありますか?

4

4 に答える 4

7

派生テーブルにラップできます。

SELECT *
FROM (
  SELECT DISTINCT id 
  FROM items 
  WHERE id IN (5,2,9) 
) t
ORDER BY
 CASE id
  WHEN 5 THEN 1 
  WHEN 2 THEN 2
  WHEN 9 THEN 3
 END
于 2011-07-25T21:39:03.347 に答える
1

ドキュメントから:

ヒント:集計式を使用せずにグループ化すると、列内の個別の値のセットが効果的に計算されます。これは、DISTINCT 句を使用して実現することもできます (セクション 7.3.3を参照)。

SQL クエリ:

SELECT id 
FROM items 
WHERE id IN (5,2,9) 
GROUP BY id
ORDER BY
    CASE id
        WHEN 5 THEN 1 
        WHEN 2 THEN 2
        WHEN 9 THEN 3
    END;
于 2011-07-25T22:02:22.080 に答える
1

周りを見回しても、この質問に対する完全な解決策は見つかりませんでした。

より良い解決策は、このクエリを使用することだと思います

SELECT *
FROM items
WHERE id IN (5,2,9) 
ORDER BY idx(array[5,2,9]::integer[], items.id)

PostgreSQL >= 9.2 を使用している場合は、拡張機能を有効にする idx 関数を有効にすることができます。

CREATE EXTENSION intarray;

それ以外の場合は、次の方法で作成できます。

CREATE OR REPLACE FUNCTION idx(anyarray, anyelement)
  RETURNS INT AS 
$$
  SELECT i FROM (
     SELECT generate_series(array_lower($1,1),array_upper($1,1))
  ) g(i)
  WHERE $1[i] = $2
  LIMIT 1;
$$ LANGUAGE SQL IMMUTABLE;

::integer[]配列を動的に作成している場合、要素がない可能性があるため、クエリで使用することをお勧めします。その結果、 ids(array[], items.id)PostgreSQL で例外が発生します。

于 2015-12-10T18:42:39.383 に答える
1

私はこの関数を postgres PL/PGSQL で作成しましたが、非常に使いやすくなっています。

-- Function: uniqueseperategeomarray(geometry[], double precision)

-- DROP FUNCTION uniqueseperategeomarray(geometry[], double precision);

CREATE OR REPLACE FUNCTION manualidsort(input_id int, sort_array int[])
  RETURNS int AS
$BODY$
DECLARE
input_index int;
each_item int;
index int;
BEGIN
index := 1;
  FOREACH each_item IN ARRAY sort_array
  LOOP
    IF each_item = input_id THEN
      RETURN index;
    END IF;
    index := index+1;
  END LOOP;
END;
$BODY$
  LANGUAGE plpgsql;
ALTER FUNCTION manualidsort(int, int[])
  OWNER TO staff;

そして、クエリを実行すると、次のようになります...

SELECT * FROM my_table ORDER BY manualidsort(my_table_id, ARRAY[25, 66, 54])
于 2014-08-08T04:19:57.077 に答える