SQL 오름차순 정렬 시 null 값이 마지막에 오도록 하는 방법
날짜 필드가 있는 SQL 테이블이 있습니다.해당 필드는 null일 수 있습니다.쿼리가 있고 결과가 datetime 필드별로 오름차순으로 정렬되지만 datetime 필드가 처음이 아닌 목록 끝에 null인 행을 원합니다.
그것을 달성할 수 있는 간단한 방법이 있습니까?
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
("조금" 늦었지만, 이것은 전혀 언급되지 않았습니다)
DBMS를 지정하지 않았습니다.
표준 SQL(및 Oracle, Postgre와 같은 대부분의 최신 DBMS)에서SQL, DB2, Firebird, Apache Derby, HSQLDB 및 H2)를 지정할 수 있습니다.NULLS LAST또는NULLS FIRST:
사용하다NULLS LAST끝까지 정렬합니다.
select *
from some_table
order by some_column DESC NULLS LAST
저는 또한 이것을 우연히 발견했고 MySQL과 Postgre에서 다음과 같은 것들이 저를 위해 속임수를 쓰는 것 같습니다.SQL:
ORDER BY date IS NULL, date DESC
https://stackoverflow.com/a/7055259/496209 에서 확인할 수 있습니다.
엔진이 허용하는 경우ORDER BY x IS NULL, x또는ORDER BY x NULLS LAST그것을 사용합니다.하지만 도움이 되지 않는다면 다음과 같습니다.
숫자 유형으로 정렬하는 경우 다음 작업을 수행할 수 있습니다. (다른 답변에서 스키마를 빌립니다.
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;
null이 아닌 모든 숫자는 0이 되고 null은 1이 됩니다. 0 < 1 때문에 null이 마지막으로 정렬됩니다.
문자열에 대해서도 이 작업을 수행할 수 있습니다.
SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName
null이 아닌 문자열은 다음과 같습니다.''그리고 null이 됩니다.'a'마지막으로 Null을 정렬하는 이유는''<'a'.
이것은 null 가능한 int로 강제하고 위의 int에 대한 방법을 사용함으로써 날짜에도 작동합니다.
SELECT *
FROM Employees
ORDER BY ISNULL(CONVERT(INT, HireDate)*0, 1), HireDate
(스키마에 HireDate가 있는 것으로 가정합니다.)
이러한 방법을 사용하면 모든 유형의 "최대" 값을 지정하거나 관리하거나 데이터 유형(및 최대)이 변경되는 경우 쿼리를 수정해야 하는 문제를 방지할 수 있습니다(다른 ISNUL 솔루션에서 발생하는 두 가지 문제).게다가 그것들은 케이스보다 훨씬 짧습니다.
아래와 같이 기본 제공 기능을 사용하여 null 또는 null이 아닌지 확인할 수 있습니다.저는 그것을 테스트하고 잘 작동합니다.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
order by coalesce(date-time-field,large date in future)
순서 열이 숫자(순위)인 경우 -1을 곱한 다음 내림차순으로 정렬할 수 있습니다.그러면 원하는 순서는 유지되지만 NULL은 마지막에 배치됩니다.
select *
from table
order by -rank desc
Oracle에서 다음을 사용할 수 있습니다.NULLS FIRST또는NULLS LASTNULL이 아닌 값 앞/뒤에 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
MariaDB를 사용하는 경우 NULL 값 설명서에서 다음과 같이 언급됩니다.
주문
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;또한 모든 NULL 값은 DISTINCT 및 GROUP BY 절의 목적을 위해 동등한 것으로 간주됩니다.
위에는 NULL 값을 기준으로 정렬하는 두 가지 방법이 나와 있습니다. 이러한 방법을 ASC 및 DESC 키워드와 결합할 수도 있습니다.예를 들어 NULL 값을 먼저 가져오는 다른 방법은 다음과 같습니다.
SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
-- ^^^^
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId, 99999);

RedFilter가 null 날짜 필드를 정렬하는 버그 문제에 대한 훌륭한 해결책을 제공해 주셔서 감사합니다.
프로젝트에 SQL Server 데이터베이스를 사용하고 있습니다.
datetime null 값을 '1'로 변경하면 datetime 데이터 유형 열을 정렬하는 문제가 해결됩니다.그러나 날짜/시간 데이터 유형이 아닌 다른 열이 있는 경우에는 처리하지 못합니다.
열에 'Z'로 시작하는 값이 없다는 것을 알고 'ZZZZZZ'를 사용하여 열 정렬을 처리했습니다.예상대로 작동했습니다.
같은 라인에서 int와 다른 데이터 유형에 대해 max value +1을 사용하여 예상대로 정렬했습니다.이것은 또한 저에게 필요한 결과를 주었습니다.
그러나 데이터베이스 엔진 자체에서 다음과 같은 작업을 수행할 수 있는 더 쉬운 작업을 수행하는 것이 항상 이상적입니다.
Order by Col1 Asc Nulls Last, Col2 Asc Nulls First
_horse_with_no_name이 제공한 답변에 언급된 바와 같이,
"대소문자"를 사용하는 솔루션은 보편적이지만 인덱스를 사용하지 않습니다.
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)
NVL 기능 사용
select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))
가장 유명한 DBMS에서 NVL의 대안은 다음과 같습니다.
order by -cast([nativeDateModify] as bigint) desc
언급URL : https://stackoverflow.com/questions/1498648/sql-how-to-make-null-values-come-last-when-sorting-ascending
'programing' 카테고리의 다른 글
| VB의 여러 줄에 걸친 단일 문입니다.밑줄 문자가 없는 NET (0) | 2023.05.09 |
|---|---|
| 스레드에서 반환 값을 가져오는 방법은 무엇입니까? (0) | 2023.05.09 |
| 메이븐 다운로드에는 .last가 확장으로 업데이트되었습니다. (0) | 2023.05.09 |
| LINQ를 사용하여 목록이 비어 있는지 확인하는 중 (0) | 2023.05.09 |
| 두 기준의 모든 조합을 반환하면서 여러 기준에 가입하는 방법은 무엇입니까? (0) | 2023.05.09 |

