在Postgres中,可以执行这样的命令
SELECT * FROM mytable
WHERE id in (8, 6, 7, 5, 10, 24)
ORDER BY id=8 DESC, id=6 DESC, id=7 DESC, id=5 DESC, id=10 DESC, id=24 DESC;
以任意顺序选择任意数据。
我曾想过,如果某个排序算法有O(log ),而我们天真地做了一个indexof排序,如下所示:
data.sort(function(a, b) {
return indexOf(a) < indexOf(b);
});
然后,我们每次排序操作可能需要O(2n),使我们的总算法时间为O( n )。
然后,我们可以创建一个简单的位置值索引,而不是每次都重新排序。假设这也有O(log )的最坏时间,那么对于我们的排序算法,我们得到O((log )(Log))或O((log )^2)。对于算法来说,这并不是很好的性能。
Postgres使用什么算法,什么性能?如果它比O((log )* the_sort_algorithms_performance)好,我们将在db之外实现排序。或者,如果算法是一种我们可以很容易移植到Java的算法,我们可能仍然不会在Postgres中进行排序。
发布于 2015-03-20 21:25:53
TLDR;你的宽泛的问题不涉及细节。排序算法是一个复杂的领域。
至于您的查询:如果您提供了一个值列表,这可能会更便宜,因为您无论如何都必须按某种顺序传递这些值:
SELECT t.*
FROM unnest('{8, 6, 7, 5, 10, 24}'::int[]) id
JOIN mytable t USING (id);
这是可行的,但不能保证。当然(在Postgres 9.4+中):
SELECT *
FROM unnest('{8, 6, 7, 5, 10, 24}'::int[]) WITH ORDINALITY x(id, rn)
JOIN mytable t USING (id)
ORDER BY x.rn;
详细信息:
https://stackoverflow.com/questions/29174882
复制