SQL Server ORDER BY 날짜 및 Null 마지막
날짜별로 주문하려고 합니다.가장 최근 날짜가 먼저 오길 원합니다.그건 충분히 쉽지만, 무효인 기록과 날짜가 있는 기록보다 먼저 나오는 기록들이 많이 있습니다.
몇 가지 시도를 해봤지만 성공하지 못했습니다.
ORDER BY ISNULL(Next_Contact_Date, 0)
ORDER BY ISNULL(Next_Contact_Date, 999999999)
ORDER BY coalesce(Next_Contact_Date, 99/99/9999)
날짜별로 주문하고 Null을 마지막에 가져오려면 어떻게 해야 합니까?데이터 타입은smalldatetime
.
smalldatetime
최대 2079년 6월 6일까지 사용할 수 있습니다.
ORDER BY ISNULL(Next_Contact_Date, '2079-06-05T23:59:00')
정당한 레코드가 그 날짜를 가지지 않는 경우.
이 가정이 아니라면 두 개의 열을 정렬하는 것이 더 강력한 옵션입니다.
ORDER BY CASE WHEN Next_Contact_Date IS NULL THEN 1 ELSE 0 END, Next_Contact_Date
그러나 위의 두 제안 모두 인덱스를 사용하여 일종의 회피와 유사한 계획을 제시할 수 없습니다.
이러한 지수가 존재할 경우 다른 한 가지 가능성은 다음과 같습니다.
SELECT 1 AS Grp, Next_Contact_Date
FROM T
WHERE Next_Contact_Date IS NOT NULL
UNION ALL
SELECT 2 AS Grp, Next_Contact_Date
FROM T
WHERE Next_Contact_Date IS NULL
ORDER BY Grp, Next_Contact_Date
MS SQL Server 2012용 T-SQL Fundamentals의 저자 Itzik Ben-Gan에 따르면 "SQL Server는 기본적으로 NULL 이외의 값 앞에 NULL 마크를 정렬합니다.마지막으로 정렬할 NULL 마크를 가져오려면 " Next_Contact_Date" 열이 NULL일 때 1을 반환하고 NULL이 아닌 경우 0을 반환하는 CASE 식을 사용합니다.NULL 이외의 마크는 식에서0을 반환하므로 NULL 마크 앞에 정렬됩니다(1).이 CASE 표현은 첫 번째 정렬 컬럼으로 사용됩니다."Next_Contact_Date 열은 두 번째 정렬 열로 지정해야 합니다.이렇게 하면 NULL이 아닌 마크가 서로 올바르게 정렬됩니다."다음은 MS SQL Server 2012(및 SQL Server 2014)의 예에 대한 솔루션 쿼리입니다.
ORDER BY
CASE
WHEN Next_Contact_Date IS NULL THEN 1
ELSE 0
END, Next_Contact_Date;
IIF 구문을 사용한 동등한 코드:
ORDER BY
IIF(Next_Contact_Date IS NULL, 1, 0),
Next_Contact_Date;
order by -cast([Next_Contact_Date] as bigint) desc
SQL이 지원되지 않는 경우NULLS FIRST
또는NULLS LAST
이 작업을 수행하는 가장 간단한 방법은value IS NULL
식:
ORDER BY Next_Contact_Date IS NULL, Next_Contact_Date
끝에는 늘을 붙이다NULLS LAST
) 또는
ORDER BY Next_Contact_Date IS NOT NULL, Next_Contact_Date
Null을 전면에 배치하는 것입니다.이것은 열의 유형을 알 필요가 없으며, 읽기 쉽습니다.CASE
표현.
편집: 안타깝게도 이것은 Postgre와 같은 다른 SQL 구현에서도 작동합니다.SQL 및 MySQL은 MS SQL Server에서 작동하지 않습니다.테스트할 SQL Server가 없었기 때문에 Microsoft의 문서와 다른 SQL 구현 테스트에 의존했습니다.마이크로소프트에 따르면,value IS NULL
다른 표현과 마찬가지로 사용할 수 있는 표현입니다.그리고.ORDER BY
다른 표현과 마찬가지로 표현도 표현해야 합니다.하지만 실제로는 효과가 없습니다.
SQL Server인 것 .CASE
★★★★★★ 。
조금 늦었지만, 누군가 유용하다고 생각할지도 몰라요.
저는 ISNULL이 테이블 스캔 때문에 불가능했어요.UNION ALL은 복잡한 질문을 반복해야 하는데, 제가 TOP X만 선택했기 때문에 그다지 효율적이지 않았을 것입니다.
테이블 설계를 변경할 수 있는 경우 다음을 수행할 수 있습니다.
정렬 전용 필드(예: Next_Contact_Date_Sort)를 추가합니다.
필요한 값에 따라 해당 필드에 큰 값(또는 작은 값)을 채우는 트리거를 만듭니다.
CREATE TRIGGER FILL_SORTABLE_DATE ON YOUR_TABLE AFTER INSERT,UPDATE AS BEGIN SET NOCOUNT ON; IF (update(Next_Contact_Date)) BEGIN UPDATE YOUR_TABLE SET Next_Contact_Date_Sort=IIF(YOUR_TABLE.Next_Contact_Date IS NULL, 99/99/9999, YOUR_TABLE.Next_Contact_Date_Sort) FROM inserted i WHERE YOUR_TABLE.key1=i.key1 AND YOUR_TABLE.key2=i.key2 END END
필요에 따라 desc를 사용하고 -1을 곱합니다.null last를 사용한 오름차순 int 순서 예:
select *
from
(select null v union all select 1 v union all select 2 v) t
order by -t.v desc
오래된 건 알지만 이게 나한테 효과가 있었어
Order by Isnull(Date,'12/31/9999')
결국 Null을 표시하고 인덱스를 사용하여 정렬할 수 있는 방법을 찾은 것 같습니다.
아이디어는 매우 간단합니다. 기존 열을 기반으로 계산 가능한 열을 만들고 인덱스를 붙입니다.
ALTER TABLE dbo.Users
ADD [FirstNameNullLast]
AS (case when [FirstName] IS NOT NULL AND (ltrim(rtrim([FirstName]))<>N'' OR [FirstName] IS NULL) then [FirstName] else N'ZZZZZZZZZZ' end) PERSISTED
따라서 SQL에 영속적인 계산 가능 컬럼을 만듭니다.이 컬럼에서는 공백 및 늘 값이 모두 'ZZZZZZ'로 대체됩니다.즉, 해당 컬럼을 기준으로 정렬하면 마지막에 늘 또는 공백 값이 모두 표시됩니다.이제 새 인덱스에 사용할 수 있습니다.
다음과 같이 합니다.
CREATE NONCLUSTERED INDEX [IX_Users_FirstNameNullLast] ON [dbo].[Users]
(
[FirstNameNullLast] ASC
)
이것은 일반적인 비클러스터형 인덱스입니다.추가 열 포함, 인덱스 열 수 증가, 정렬 순서 변경 등 원하는 대로 변경할 수 있습니다.
오래된 스레드인 것은 알지만 SQL Server에서 null은 항상 null이 아닌 값보다 낮습니다.따라서 Description으로 주문만 하면 됩니다.
의 경우Order by Next_Contact_Date Desc
분할할겁겁겁
출처: nulls를 사용한 주문 기준 - LearnSql
언급URL : https://stackoverflow.com/questions/5886857/sql-server-order-by-date-and-nulls-last
'programing' 카테고리의 다른 글
Ruby에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법 (0) | 2023.04.13 |
---|---|
SQL Server 데이터베이스로 Excel 스프레드시트 열 가져오기 (0) | 2023.04.13 |
라이브(저장되지 않은) Excel 데이터와 C# 객체 간의 인터페이스를 위한 가장 빠른 방법 (0) | 2023.04.13 |
Python의 목록 내에서 하위 문자열 찾기 (0) | 2023.04.13 |
MVVM Light Toolkit을 사용하여 새 창을 여는 방법 (0) | 2023.04.13 |