我无法对查询结果进行排序。
执行此查询后:
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 :(得分: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)
答案 1 :(得分: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
如果您将排序顺序“硬编码”到查询中,则必须在优先级更改时更改查询。将排序优先级保持为一种元数据更加灵活,如果使用带小数点的数字,则始终可以将新值注入排序顺序,而无需重新编号。
答案 2 :(得分:0)
我相信你的后一个例子应该如此:
ORDER BY id_clasificacion_doc = 5 DESC,
id_clasificacion_doc = 3 DESC,
id_clasificacion_doc = 2 DESC,
id_clasificacion_doc = 4 DESC;
答案 3 :(得分:0)
自Postgres 9.5起,可能有更好的解决方案
order by array_position(ARRAY[5, 3, 2, 4]::integer[], id_clasificacion_doc)