Database PostgreSQL:WHERE id=ANY(idsArray)-按idsArray对结果排序

Database PostgreSQL:WHERE id=ANY(idsArray)-按idsArray对结果排序,database,postgresql,Database,Postgresql,在Postgres中使用WHERE…任何样式的查询按给定数组对结果排序时,我是否缺少一个技巧?即: SELECT * FROM table WHERE id = ANY (<idsInDesiredOrder>) 选择* 从桌子上 其中id=ANY() 在SQL中,当您要对结果使用进行排序时,必须使用“order BY”子句。否则,结果的顺序是不可预测的。因此,将您的查询重写为 SELECT * FROM table WHERE id = ANY (<preSortedIds

在Postgres中使用
WHERE…任何
样式的查询按给定数组对结果排序时,我是否缺少一个技巧?即:

SELECT *
FROM table
WHERE id = ANY (<idsInDesiredOrder>)
选择*
从桌子上
其中id=ANY()

在SQL中,当您要对结果使用进行排序时,必须使用“order BY”子句。否则,结果的顺序是不可预测的。因此,将您的查询重写为

SELECT *
FROM table
WHERE id = ANY (<preSortedIds>)
ORDER BY id
选择*
从桌子上
其中id=ANY()
按id订购
或许可以帮助您:

WITH sample (id, description) AS (
    VALUES 
        (1, 'lorem ipsum'),
        (2, 'lorem ipsum'),
        (3, 'lorem ipsum'),
        (4, 'lorem ipsum')
)
SELECT 
    * 
FROM 
    sample 
WHERE 
    id = ANY (ARRAY[3,2]) 
ORDER BY 
    array_position(ARRAY[3,2], id);

正如Marc所提到的,如果没有
orderby
子句,SQL永远不会保证排序。从历史上看,这种情况在Postgres中是有问题的,因为您无法编写引用数组索引的
ORDER BY

他们在9.4中通过为set返回函数调用添加
WITH ORDINALITY
子句解决了这一问题,允许您将数组解压为“values”列和“index”列:

从表中选择*
使用(id)将UNNEST()与序号u(id,pos)连接起来
通过pos订购

IDSRARY不是按顺序排列的,它不需要按顺序排列。我想我误解了你的意思,你希望生成的表按排序前的顺序排列,对吗?
SELECT * FROM table
JOIN UNNEST(<preSortedIds>) WITH ORDINALITY u(id,pos) USING (id)
ORDER BY pos