PostgreSQL:按照自定义标准排序列

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

我正在使用posgresql 9.1。

提前感谢。


你的优先级列表是否以某种方式存储在数据库中?(你的问题暗示它被存储为单列表,但这是不可能的,因为表是无序的。) - ruakh
是的,它存储在我的数据库表中,但不是有序的。 - emco
那么,你实际上没有一个优先级列表,而是有一个无序的优先级集合:如果一个值出现在表中,那么就意味着“是的,这个值有一个优先级。你不希望有一种方法来找出它的优先级吗?” - ruakh
我编辑了我的问题。希望这次清楚了。 - emco
4个回答

13

尝试明确指定排序顺序:

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)

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

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

1

我相信你的后一个示例应该可以这样工作:

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

老兄,你救了我的一天! - AbdulMoizHussain

0
自Postgres 9.5以来,有一个更好的解决方案。
order by array_position(ARRAY[5, 3, 2, 4]::integer[], id_clasificacion_doc)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接