2014-07-04 3 views
2

기본 키 목록이있는 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 인젝션 경고를 신경 쓸, 이것은 일례이고; 키스.

어떻게 그 순서를 유지하겠습니까, 또는 효율적으로 주어진 원래의 결과 집합을 주문할 것이라고?

감사합니다.

답변

2

unnestids 배열과 함께 색인으로 배열됩니다. 그런 다음 inner join이 순서대로 생성 된 색인을 사용하여 목표 테이블로 설정됩니다. 이 예에서 tgenerate_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 대신 기존 테이블을 사용합니다. 당신이

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); 
+0

와우 문자열 건물 엉망으로하지 않아도 자바 스크립트 사용 String.replace()에서 ids 배열을 전달합니다! 나는 그런 정교한 SQL 쿼리를 기대하지 않았다! 나는 그것을 시도해 보겠습니다. –

+2

@Yanick은 단순화 된 실제 자바 스크립트 코드로 업데이트되었습니다. –

관련 문제