Postgresql:对列进行排序以匹配自定义条件

Postgresql:对列进行排序以匹配自定义条件,sql,sorting,postgresql-9.1,Sql,Sorting,Postgresql 9.1,我无法对查询结果进行排序 执行此查询后: 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

我无法对查询结果进行排序

执行此查询后:

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

提前感谢。

正如@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

如果将排序顺序“硬编码”到查询中,则必须在优先级更改时更改查询。将排序优先级保持为一种元数据更为灵活,如果使用带小数点的数字,则始终可以在排序顺序中插入新值,而无需对所有内容重新编号。

尝试通过以下方式明确排序顺序:

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)

我相信你的后一个例子应该是这样的:

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

从Postgres 9.5开始,一个更好的解决方案是可能的

order by array_position(ARRAY[5, 3, 2, 4]::integer[], id_clasificacion_doc)

您的优先级列表是否以某种方式存储在数据库中?(您的问题意味着它存储为一个单列表,但这是不可能的,因为表没有顺序。)是的,它存储在我的数据库的一个表中,而不是,没有顺序。因此,您实际上没有优先级列表,您有一个无序的优先级集:如果表中出现一个值,那么这意味着“是的,此值具有优先级。难道你不希望有什么办法来找出它的优先次序吗?”我编辑了我的问题。我希望这次能说清楚。