날짜 시간 필드가있는 SQL 테이블이 있습니다. 해당 필드는 null 일 수 있습니다. 쿼리가 있고 날짜 시간 필드별로 결과를 오름차순으로 정렬하고 싶지만 시작 시간이 아니라 목록의 끝에서 날짜 시간 필드가 null 인 행을 원합니다.
그것을 달성하는 간단한 방법이 있습니까?
날짜 시간 필드가있는 SQL 테이블이 있습니다. 해당 필드는 null 일 수 있습니다. 쿼리가 있고 날짜 시간 필드별로 결과를 오름차순으로 정렬하고 싶지만 시작 시간이 아니라 목록의 끝에서 날짜 시간 필드가 null 인 행을 원합니다.
그것을 달성하는 간단한 방법이 있습니까?
답변:
select MyDate
from MyTable
order by case when MyDate is null then 1 else 0 end, MyDate
order by case when MyDate is null then 1 else 0 end
정말 긴 말입니다ORDER BY MyDate IS NULL
order by 0
열 인덱스로 해석 되므로 열 인덱스는 1 기반입니다. 세 번째 열을 기준으로 쿼리를 정렬하려면 order by 3
프로덕션 쿼리에 대한 끔찍한 아이디어 라고 할 수 있지만 *
실험 할 때 매우 편리합니다 .
( "비트"늦었지만, 이것은 전혀 언급되지 않았습니다)
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
NULLS FIRST
및 NULLS LAST
SQL : 2003에 추가되었지만 다른 DMBS에서 사용할 수있는 표준 구현은 없습니다. 데이터베이스 엔진에 따라 ORDER BY expr some_column DESC NULLS LAST
(Oracle), ORDER BY ISNULL(some_column, 1), some_column ASC
(MSSQL) 또는 ORDER BY ISNULL(some_column), some_column ASC
(다른 ISNULL () 구현으로 MySQL)을 사용하십시오.
ASC
/ DESC
어떤이 할 null로. 따라서이를 보장하는 유일한 방법 은 DBMS 가이를 지원하는 NULL FIRST/LAST
경우 사용 하는 것입니다. 그것은 당신이 의도 한 것을 문서화 합니다. 의 사용 isnull()
또는 다른 기능에 대한 누락 된 지원을위한 해결 방법입니다 NULLS FIRST/LAST
(오라클, PostgreSQL을, DB2, 파이어 버드, 아파치 더비, HSQLDB와 H2로 suported됩니다)
expr
NULLS FIRST / LAST를 사용할 때 키워드를 요구하는 Oracle과 같은 전문 지식이있는 DBMS가 있다는 사실을 추가하고 싶었습니다 . 그리고 데이터베이스 유형에 따라 null이 첫 번째 / 마지막으로 표시되는 것에 대해 감사합니다.
NULLS LAST
MySQL 데이터베이스에서 작동하지 않았습니다.
나는 또한 이것을 우연히 발견했으며 다음은 MySQL과 PostgreSQL에서 나를 위해 속임수를 쓰는 것처럼 보입니다.
ORDER BY date IS NULL, date DESC
IS NULL
하고 IS NOT NULL
내 MySQL 데이터베이스에 작업을하지 않았다.
order by coalesce(date-time-field,large date in future)
내장 함수를 사용하여 아래와 같이 null 여부를 확인할 수 있습니다. 나는 그것을 테스트하고 잘 작동합니다.
select MyDate from MyTable order by ISNULL(MyDate,1) DESC, MyDate ASC;
ISNULL(MyDate) DESC, MyDate ASC
할 수 있지만 올바른 순서로 정렬되지 않았습니다.
엔진이 허용 ORDER BY x IS NULL, x
하거나 ORDER BY x NULLS LAST
사용하는 경우. 그러나 그것이 도움이되지 않으면 :
당신이 숫자 유형으로 분류하는 경우 당신은이 작업을 수행 할 수 있습니다 (에서 스키마를 빌려 다른 답변 .)
SELECT *
FROM Employees
ORDER BY ISNULL(DepartmentId*0,1), DepartmentId;
널이 아닌 숫자는 0이되고 널은 1이되어 널을 마지막으로 정렬합니다.
문자열에 대해서도이 작업을 수행 할 수 있습니다.
SELECT *
FROM Employees
ORDER BY ISNULL(LEFT(LastName,0),'a'), LastName
때문에 '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 FIRST
or 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
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;
DISTINCT 및 GROUP BY 절의 목적 상 모든 NULL 값도 동등한 것으로 간주됩니다.
위의 두 가지 방법으로 NULL 값을 정렬 할 수 있으며 ASC 및 DESC 키워드와 함께 조합 할 수도 있습니다. 예를 들어 NULL 값을 먼저 얻는 다른 방법은 다음과 같습니다.
SELECT col1 FROM tab ORDER BY ISNULL(col1) DESC, col1;
-- ^^^^
"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)
UNION ALL
.
NVL 기능 사용
select * from MyTable order by NVL(MyDate, to_date('1-1-1','DD-MM-YYYY'))
가장 유명한 DBMS에서 NVL의 대안은 다음과 같습니다.