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')