3

クエリの結果を並べ替えるのに問題があります。

このクエリを実行した後:

SELECT id_doc_header, id_clasificacion_doc 
FROM cabecera_documento INNER JOIN tipo_doc USING (id_tipo_doc) 
 INNER JOIN clasificacion_documento USING (id_clasificacion_doc) 
WHERE finalizado = 'f' AND cod_exp = '10-APC-2013' AND id_clasificacion_doc in(2,3,4,5)
ORDER BY case when Id_clasificacion_doc = 5 THEN 5 when Id_clasificacion_doc = 3 THEN 3 
  when Id_clasificacion_doc = 2 THEN 2 when Id_clasificacion_doc = 4 THEN 4 END;

またはこれ:

SELECT id_doc_header, id_clasificacion_doc 
FROM cabecera_documento INNER JOIN tipo_doc USING (id_tipo_doc) 
INNER JOIN clasificacion_documento USING (id_clasificacion_doc) 
WHERE finalizado = 'f' AND cod_exp = '10-APC-2013' 
AND id_clasificacion_doc in(2,3,4,5) 
ORDER BY id_clasificacion_doc = 5, id_clasificacion_doc = 3, id_clasificacion_doc = 2, id_clasificacion_doc = 4;

私が得る結果は次のとおりです。

 id_doc_header | id_clasificacion_doc 
---------------+----------------------
          1657 |                    2
          1658 |                    3
          1658 |                    2
          1661 |                    4
          1663 |                    4
          1665 |                    5

私の質問は次のとおりです。次の順序で結果を取得するにはどうすればよいですか?

 id_doc_header | id_clasificacion_doc 
---------------+----------------------
          1665 |                    5
          1658 |                    3
          1657 |                    2
          1661 |                    4
          1663 |                    4

posgresql9.1を使用しています。

前もって感謝します。

4

4 に答える 4

10

次の方法で順序を明示してみてください。

order by (case when id_clasificacion_doc = 5 then 1
               when id_clasificacion_doc = 3 then 2
               when id_clasificacion_doc = 2 then 3
               when id_clasificacion_doc = 4 then 4
          end)
于 2013-02-05T18:21:53.737 に答える
1

@ruakhがほのめかしたように:

AnimalsPriority (animal varchar, priority numeric)
cat, 2.0
dog, 1.0
moose, 1.1

Animals (animal varchar)
cat
dog
moose


select * from Animals A
inner join AnimalsPriority AP
on A.animal = AP.animal
order by AP.priority

ソート順をクエリに「ハードコーディング」する場合、優先度が変更された場合はクエリを変更する必要があります。メタデータの一種として並べ替えの優先度を維持する方が柔軟性が高く、小数点付きの数値を使用すると、すべての番号を付け直すことなく、いつでも新しい値を並べ替え順序に挿入できます。

于 2013-02-05T18:21:30.527 に答える
0

後者の例は次のように機能するはずです。

ORDER BY id_clasificacion_doc = 5 DESC,
         id_clasificacion_doc = 3 DESC,
         id_clasificacion_doc = 2 DESC,
         id_clasificacion_doc = 4 DESC;
于 2016-12-08T03:02:41.417 に答える
0

Postgres 9.5以降、これに対するより良い解決策が可能です。

order by array_position(ARRAY[5, 3, 2, 4]::integer[], id_clasificacion_doc)
于 2020-08-06T14:15:02.180 に答える