열 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.