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

3

在Postgres中使用WHERE...ANY样式查询并按给定数组排序时,我是否遗漏了什么技巧?例如:

SELECT *
FROM table
WHERE id = ANY (<idsInDesiredOrder>)
3个回答

2
也许array_position可以帮助你:
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);

2
正如Marc所提到的,没有ORDER BY子句,SQL永远不会保证排序。历史上,在Postgres中这样的情况很棘手,因为您无法编写引用数组索引的ORDER BY
在9.4版本中,他们通过为集合返回函数调用添加WITH ORDINALITY子句来解决了这个问题,允许您将数组拆分成“值”列和“索引”列:
SELECT * FROM table
JOIN UNNEST(<preSortedIds>) WITH ORDINALITY u(id,pos) USING (id)
ORDER BY pos

0
在SQL中,如果你想要对结果进行排序,则必须使用“ORDER BY”子句。否则,结果将是无法预测的顺序。因此,请重写你的查询:
SELECT *
FROM table
WHERE id = ANY (<preSortedIds>)
ORDER BY id

idsArray 不是按顺序排列的。 - daviestar
它不需要按顺序。 - Marc Balmer
我觉得我误解了你的意思,你想要结果表按照预先排序的ID顺序排列,对吗? - Marc Balmer

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