Database PostgreSQL:WHERE id=ANY(idsArray)-按idsArray对结果排序
在Postgres中使用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
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