[sql] IN 값 목록으로 주문

PostgreSQL 8.3에는 많은 주석을 얻는 간단한 SQL 쿼리가 있습니다. 나는 제공 정렬 받는 값 목록 IN의 구조 WHERE절을 :

SELECT * FROM comments WHERE (comments.id IN (1,3,2,4));

이것은 내에서 id와 같은 임의의 순서로 주석을 반환합니다 1,2,3,4.

결과 행이 IN구문 의 목록처럼 정렬되기를 원합니다 (1,3,2,4).
그것을 달성하는 방법?



답변

(PostgreSQL 8.2에서 도입) VALUES (), ()를 사용하면 쉽게 할 수 있습니다.

구문은 다음과 같습니다.

select c.*
from comments c
join (
  values
    (1,1),
    (3,2),
    (2,3),
    (4,4)
) as x (id, ordering) on c.id = x.id
order by x.ordering


답변

찾기가 너무 어렵고 확산되어야하기 때문에 mySQL에서는 훨씬 간단하게 수행 할 수 있지만 다른 SQL에서 작동하는지는 알 수 없습니다.

SELECT * FROM `comments`
WHERE `comments`.`id` IN ('12','5','3','17')
ORDER BY FIELD(`comments`.`id`,'12','5','3','17')


답변

Postgres 9.4 이상 에서는 아마도 가장 간단하고 빠릅니다 .

SELECT c.*
FROM   comments c
JOIN   unnest('{1,3,2,4}'::int[]) WITH ORDINALITY t(id, ord) USING (id)
ORDER  BY t.ord;
  • @a_horse 는 새로운 WITH ORDINALITY것을 사용하여 이미 언급했다 .

  • 하위 쿼리가 필요하지 않으며 테이블처럼 set-returning 함수를 사용할 수 있습니다.

  • ARRAY 생성자 대신 배열에 전달할 문자열 리터럴 은 일부 클라이언트에서 구현하기가 더 쉬울 수 있습니다.

상해:


답변

나는이 방법이 더 낫다고 생각한다.

SELECT * FROM "comments" WHERE ("comments"."id" IN (1,3,2,4))
    ORDER BY  id=1 DESC, id=3 DESC, id=2 DESC, id=4 DESC


답변

Postgres 9.4를 사용하면 조금 더 짧게 수행 할 수 있습니다.

select c.*
from comments c
join (
  select *
  from unnest(array[43,47,42]) with ordinality
) as x (id, ordering) on c.id = x.id
order by x.ordering;

또는 파생 테이블이 없으면 조금 더 컴팩트합니다.

select c.*
from comments c
  join unnest(array[43,47,42]) with ordinality as x (id, ordering)
    on c.id = x.id
order by x.ordering

각 값에 위치를 수동으로 할당 / 유지할 필요가 없습니다.

포스트 그레스 9.6 이 사용하여 수행 할 수 있습니다 array_position():

with x (id_list) as (
  values (array[42,48,43])
)
select c.*
from comments c, x
where id = any (x.id_list)
order by array_position(x.id_list, c.id);

CTE는 값 목록을 한 번만 지정하면되므로 사용됩니다. 이것이 중요하지 않은 경우 다음과 같이 작성할 수도 있습니다.

select c.*
from comments c
where id in (42,48,43)
order by array_position(array[42,48,43], c.id);


답변

Postgres에서 다른 방법으로 idx기능 을 사용하는 것입니다.

SELECT *
FROM comments
ORDER BY idx(array[1,3,2,4], comments.id)

idx여기에 설명 된대로 먼저 함수 를 작성하는 것을 잊지 마십시오 . http://wiki.postgresql.org/wiki/Array_Index


답변

PostgreSQL에서 :

select *
from comments
where id in (1,3,2,4)
order by position(id::text in '1,3,2,4')