IT

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

lottoking 2020. 3. 25. 08:35
반응형

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

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

이 블로그 게시물을 참조하십시오 .


nullable 날짜 시간 필드 정렬의 버그 문제에 대한 우수한 솔루션을 제공 한 RedFilter에게 감사합니다.

프로젝트에 SQL Server 데이터베이스를 사용하고 있습니다.

datetime null 값을 '1'로 변경하면 datetime 데이터 형식 열의 정렬 문제가 해결됩니다. 그러나 datetime 데이터 유형 이외의 열이 있으면 처리하지 못합니다.

varchar 열 정렬을 처리하기 위해 열에 'Z'로 시작하는 값이 없다는 것을 알았으므로 'ZZZZZZZ'를 사용해 보았습니다. 예상대로 작동했습니다.

같은 줄에서 int 및 기타 데이터 유형에 대해 최대 값 +1을 사용하여 예상대로 정렬했습니다. 이것은 또한 나에게 필요한 결과를 주었다.

그러나 다음과 같은 작업을 수행 할 수있는 데이터베이스 엔진 자체에서 더 쉬운 것을 얻는 것이 항상 이상적입니다.

Order by Col1 Asc Nulls Last, Col2 Asc Nulls First 

a_horse_with_no_name이 제공 한 답변에서 언급했듯이.


Oracle에서는 NULLS FIRSTor NULLS LAST:를 사용할 수 있습니다 . NULL이 아닌 값 앞 / 뒤에 NULL 값을 반환하도록 지정합니다.

ORDER BY { column-Name | [ ASC | DESC ] | [ NULLS FIRST | NULLS LAST ] }

예를 들면 다음과 같습니다.

ORDER BY date DESC NULLS LAST

참조 : http://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqlj13658.html


order by -cast([nativeDateModify] as bigint) desc

"case"를 사용하는 솔루션은 보편적이지만 색인을 사용하지 마십시오.

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

제 경우에는 성능이 필요했습니다.

 SELECT smoneCol1,someCol2  
 FROM someSch.someTab
 WHERE someCol2 = 2101 and ( someCol1 IS NULL ) 
  UNION   
 SELECT smoneCol1,someCol2
 FROM someSch.someTab
 WHERE someCol2 = 2101 and (  someCol1 IS NOT NULL)  

MariaDB를 사용하는 경우 NULL Values ​​documentation 에서 다음을 언급합니다 .

발주

NULL 값을 포함 할 수있는 필드를 기준으로 정렬하면 모든 NULL 값이 가장 낮은 것으로 간주됩니다. 따라서 DESC 순서로 주문하면 NULL이 마지막에 나타납니다. NULL을 최고 값으로 간주하기 위해 기본 필드가 NULL 일 때 더 높은 값을 갖는 다른 열을 추가 할 수 있습니다. 예:

SELECT col1 FROM tab ORDER BY ISNULL(col1), col1;

내림차순, 먼저 NULL

SELECT col1 FROM tab ORDER BY IF(col1 IS NULL, 0, 1), col1 DESC;

DISTINCT 및 GROUP BY 절의 목적 상 모든 NULL 값도 동등한 것으로 간주됩니다.

위의 두 가지 방법으로 NULL 값을 정렬 할 수 있으며 ASC 및 DESC 키워드와 함께 조합 할 수도 있습니다. 예를 들어 NULL 값을 먼저 얻는 다른 방법은 다음과 같습니다.

SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
--                                         ^^^^

NVL 기능 사용

  select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))

가장 유명한 DBMS에서 NVL의 대안은 다음과 같습니다.

참고 URL : https://stackoverflow.com/questions/1498648/sql-how-to-make-null-values-come-last-when-sorting-ascending

반응형