根据预定义的数组对数组(结果集)进行排序

时间:2014-07-04 14:01:43

标签: javascript postgresql sorting resultset

我从给定主键列表的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。

我如何保留该订单,或者我是否会以给定的原始订单有效地订购结果集?

谢谢!

1 个答案:

答案 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);