열 ASC로 정렬하지만 먼저 NULL 값을 사용합니까?


81

날짜 / 시간 필드를 기준으로 오름차순으로 PostgreSQL 테이블을 정렬해야합니다 (예 : last_updated.

그러나 해당 필드는 비어 있거나 null이 될 수 있으며 null이 아닌 레코드가 non-null 앞에last_updated 와야 합니다. 이것이 가능한가?last_updated

order by last_updated asc  -- and null last_updated records first ??

답변:


165

Postgres는 그 요구를 정확히 충족시키기 위해 절에 NULLS FIRST | LAST대한 키워드를 제공합니다 ORDER BY.

... ORDER BY last_updated NULLS FIRST

전형적인 사용 사례 정렬 순서 (내림차순 인 DESC기본 오름차순 (의 완전한 반전 산출), ASC제 널 값을). 종종 바람직하지 않습니다. 따라서 null 값을 마지막으로 유지하려면 :

... ORDER BY last_updated DESC NULLS LAST

색인 을 사용 하여 쿼리를 지원하려면 다음과 일치하도록 만드세요.

CREATE INDEX foo_idx ON tbl (last_updated DESC NULLS LAST);

Postgres는 btree 인덱스를 역방향으로 읽을 수 있지만 NULL 값이 추가되는 위치는 중요합니다.


1
@mhd "postgres는 null 먼저 정렬"을 위해 Google을 사용하지 않았습니까?
David Aldridge 2013 년

28
내가했다. 그것이 내가이 페이지를 얻은 방법입니다. :)
ibrewster

2
답변 해 주셔서 감사합니다. PostgreSQL 굉장합니다.
greatghoul

1
답변 해주셔서 감사합니다. SQLite3는이 기능을 추가했으며 사용하기 전에 PostgreSQL과 호환되는지 확인하고 싶었습니다. 요즘 표준적인 것으로 밝혀졌습니다!
Brad

13

CASE 문을 사용하여 사용자 지정 ORDER BY를 만들 수 있습니다.
CASE 문은 조건을 확인하고 조건을 충족하지 않는 행에 할당 된 값보다 낮은 값을 해당 조건을 충족하는 행에 할당합니다.
예를 들어 이해하는 것이 가장 쉽습니다.

  SELECT last_updated 
    FROM your_table 
ORDER BY CASE WHEN last_updated IS NULL THEN 0 ELSE 1 END, 
         last_updated ASC;

1
또한 이것이 ASC기본 정렬 순서이므로 반드시 입력 할 필요는 없습니다.
mechanical_meat

3
NULLS FIRST또한 널을 먼저 작성하는 ANSI 호환 방법입니다.
a_horse_with_no_name 2014 년

3
@a_horse_with_no_name null이 아닌 경우 값을 무시하고 대신 다른 열로 정렬하기 때문에 제 경우에는 유용합니다. (임 알림을 정렬 - 보이지 않는 첫 번째 (다음 seenAt is null) 만 볼 수 있다면, 내가 정렬 createdAtinstaed)
KajMagnus

3
동의했습니다. 값이 존재하는지 여부 (이 경우 날짜)로 정렬 한 다음 이차적으로 다른 값으로 정렬하려는 경우이 기능이 유용하다는 것을 알았습니다. NULLS FIRST값이 널이 아닌 경우에도 실제 값으로 정렬됩니다. 이것은 나를 위해 트릭을했습니다. 감사!
Ben Kreeger
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.