我从给定主键列表的SQL数据库中获取数据;返回的数据并不总是以相同的顺序,我需要重新排序它们以保留原始数组索引。
例如:
var ids = [2, 12, 5, 3, 10];
var query = 'SELECT * FROM tbl_foo WHERE id IN (' + ids.join(',') + ')';
db.query(query, null, function (result) {
console.log(result.rows);
// [ { id: 2, ... },
// { id: 3, ... },
// { id: 5, ... },
// { id: 10, ... },
// { id: 12, ... } ]
});
注意:从不注意SQL注入警告,这是一个例子; KISS。
我如何保留该订单,或者我是否会以给定的原始订单有效地订购结果集?
谢谢!
答案 0 :(得分:2)
unnest
ids
数组以及集合的索引。然后inner join
使用生成的索引设置为目标表。在此示例中,t
是由generate_series
生成的目标表。 SQL Fiddle
with t as (
select id
from generate_series(1, 20) s (id)
),
a as (
select
unnest(array[2, 12, 5, 3, 10]) as id,
generate_series(1, array_length(array[2, 12, 5, 3, 10], 1)) as i
)
select t.*
from
t
inner join
a using (id)
order by a.i
以上是一个自包含的例子。在您的代码中,您将使用现有的表代替t
。在javascript中使用String.replace()
传递ids
数组,这样您就不必乱用字符串构建
var ids = [2, 12, 5, 3, 10];
var query = '\
with a as ( \
select \
unnest(array[%ids]) as id, \
generate_series(1, array_length(array[%ids], 1)) as i \
) \
select t.* \
from \
t \
inner join \
a using (id) \
order by a.i \
'.replace(%ids, ids);