2013-02-05 15 views
2

我在排序查詢結果時遇到問題。Postgresql:排序列以匹配自定義條件

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 

我使用的是posgresql 9.1。

在此先感謝。

+0

以某種方式存儲在數據庫中的優先級列表? (您的問題意味着它存儲爲單列表格,但這是不可能的,因爲表格沒有排序。) – ruakh

+0

是的,它存儲在我的數據庫的表格中,而不是,沒有排序。 – EmCo

+0

然後,你實際上沒有優先級*列表*,你有一個無序的優先級*集*:如果一個值出現在表中,那麼這意味着「是的,這個值有一個優先級,你不希望有什麼方法可以找出它的優先性?「 – ruakh

回答

8

嘗試是明確有關的順序:

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) 
+0

現在我明白了。謝謝! :) – EmCo

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 

如果「硬編碼」排序次序進入查詢,您必須在優先級的變化而變化的查詢。將排序優先級作爲一種元數據保持更加靈活,並且如果您使用帶小數點的數字,則始終可以將新值添加到排序順序中,而無需重新編號。

0

我相信你的後一個例子應該工作像這樣:

ORDER BY id_clasificacion_doc = 5 DESC, 
     id_clasificacion_doc = 3 DESC, 
     id_clasificacion_doc = 2 DESC, 
     id_clasificacion_doc = 4 DESC;