[sql] SQL 오름차순 정렬시 null 값을 마지막으로 만드는 방법

날짜 시간 필드가있는 SQL 테이블이 있습니다. 해당 필드는 null 일 수 있습니다. 쿼리가 있고 날짜 시간 필드별로 결과를 오름차순으로 정렬하고 싶지만 시작 시간이 아니라 목록의 끝에서 날짜 시간 필드가 null 인 행을 원합니다.

그것을 달성하는 간단한 방법이 있습니까?



답변

select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate


답변

( “비트”늦었지만, 이것은 전혀 언급되지 않았습니다)

DBMS를 지정하지 않았습니다.

표준 SQL (및 Oracle, PostgreSQL, DB2, Firebird, Apache Derby, HSQLDB 및 H2와 같은 대부분의 최신 DBMS)에서 NULLS LAST또는 NULLS FIRST다음을 지정할 수 있습니다 .

NULLS LAST끝까지 정렬하는 데 사용하십시오 .

select *
from some_table
order by some_column DESC NULLS LAST


답변

나는 또한 이것을 우연히 발견했으며 다음은 MySQL과 PostgreSQL에서 나를 위해 속임수를 쓰는 것처럼 보입니다.

ORDER BY date IS NULL, date DESC

에서 발견 https://stackoverflow.com/a/7055259/496209


답변

order by coalesce(date-time-field,large date in future)


답변

내장 함수를 사용하여 아래와 같이 null 여부를 확인할 수 있습니다. 나는 그것을 테스트하고 잘 작동합니다.

select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;


답변

엔진이 허용 ORDER BY x IS NULL, x하거나 ORDER BY x NULLS LAST사용하는 경우. 그러나 그것이 도움이되지 않으면 :

당신이 숫자 유형으로 분류하는 경우 당신은이 작업을 수행 할 수 있습니다 (에서 스키마를 빌려 다른 답변 .)

SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;

마지막으로 null이있는 DepartmentId로 정렬 된 결과 표시

널이 아닌 숫자는 0이되고 널은 1이되어 널을 마지막으로 정렬합니다.

문자열에 대해서도이 작업을 수행 할 수 있습니다.

SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName

마지막 null이있는 성으로 정렬 된 결과 표시

때문에 'a'> ''.

이것은 nullable int로 강제하고 위의 ints 메소드를 사용하여 날짜와도 작동합니다.

SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate

스키마에 HireDate가 있다고 가정합니다.

이러한 방법은 데이터 유형 (및 최대)이 변경되면 (다른 ISNULL 솔루션이 겪는 문제 모두) 모든 유형의 “최대”값을 가져 오거나 관리해야하는 문제를 피하거나 쿼리를 수정합니다. 또한 CASE보다 훨씬 짧습니다.


답변

주문 열에 순위와 같은 숫자가 있으면 -1을 곱한 다음 내림차순으로 정렬 할 수 있습니다. 그것은 당신이 소비하는 순서를 유지하지만 NULL을 마지막에 넣습니다.

select *
from table
order by -rank desc