我想从数据库中获取一组id对象,但PostGreSQL按ids排序返回它们:
Users.find([4, 1, 3])
=> [User 1, User 3, User 4]
我知道我可以像这样对它们进行排序:
ids = [4, 3, 1]
r = Users.find(ids)
users = ids.map{|id| r.detect{|each| each.id == id}}
但如果我能用数据库做这件事会不会更好?我知道MySQL有一个“字段”选项。 PostGreSQL有相同的东西吗?
谢谢,
凯文
答案 0 :(得分:2)
此函数将模拟MySQL中的那个
CREATE OR REPLACE FUNCTION field(anyelement, anyarray) RETURNS integer AS
$body$
SELECT COALESCE((
SELECT i
FROM generate_series(array_lower($2, 1), array_upper($2, 1)) s(i)
WHERE $2[i] = $1
),0);
$body$ LANGUAGE SQL STABLE;
使用示例:
CREATE TABLE x (id integer);
INSERT INTO x (1),(2),(3);
SELECT * FROM x ORDER BY field(id, ARRAY[3,1,2]);
id
----
3
1
2
(3 rows)