답변:
COALESCE가 ISNULL보다 비용이 적게 든다는 말을 들었지만 연구 결과는 그렇지 않습니다. ISNULL은 두 개의 매개 변수, 즉 NULL로 평가되는 필드와 NULL로 평가되는 경우 원하는 결과 만 사용합니다. COALESCE는 임의의 수의 매개 변수를 사용하고 NULL이 아닌 첫 번째 값을 반환합니다.
자세한 내용은 http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/에 훨씬 더 자세한 설명이 있습니다 .
문서가 모호하다고 생각하는 이유를 잘 모르겠습니다.
단순히 모든 매개 변수를 하나씩 살펴보고 NOT NULL
.
COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1
COALESCE(1, 2, 3, 4, 5, NULL)
=> 1
COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3
COALESCE(6, 5, 4, 3, 2, NULL)
=> 6
COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL
거의 모든 매개 변수를 허용하지만 동일한 데이터 유형이어야합니다. (동일한 데이터 유형이 아닌 경우 데이터 유형 우선 순위를 사용하여 암시 적으로 적절한 데이터 유형으로 캐스팅됩니다 .)
ISNULL()
두 개가 아닌 여러 매개 변수에 대한 것과 같습니다 .
또한의 ANSI-SQL
경우-로 ISNULL()
하지 않습니다.
ISNULL
그래도 첫 번째 매개 변수와 동일한 데이터 유형의 값 을 반환 한다고 생각합니다.
expressions
하여 CASE와 비교하고 ISNULL과 비교하고 마지막으로 결과가없는 예제로 이동합니다. 그런 다음 너무 많은 세부 사항이있는 지나치게 복잡한 예입니다. 우리가 필요로하는 것은 WTF 5-6 줄이있는이 대답뿐 일 때, 이것이 바로 그렇습니다.
제가 COALESCE를 바라 보는 방식은 다음과 같습니다.
단순한 형태로….
Coalesce (FieldName, 'Empty')
따라서 이것은 다음과 같이 변환됩니다. "FieldName"이 NULL이면 필드 값을 "EMPTY"라는 단어로 채 웁니다.
이제 여러 값에 대해 ...
합체 (FieldName1, FieldName2, Value2, Value3)
Fieldname1의 값이 null이면 Fieldname2의 값으로 채우고 FieldName2가 NULL이면 Value2로 채우십시오.
AdventureWorks2012 샘플 데이터베이스에 대한이 테스트 코드 는 완벽하게 작동하며 COALESCE 작동 방식에 대한 시각적 설명을 제공 합니다.
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
ISNULL을 대체하는 것보다 더 많은 통합이 필요합니다. 통합의 공식 "문서"가 모호하고 도움이되지 않는다는 데 전적으로 동의합니다. 이 기사는 많은 도움이됩니다. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
다음은 통합을 포함하는 간단한 쿼리입니다.
select * from person where coalesce(addressId, ContactId) is null.
addressId와 contactId가 모두 null 인 사람을 반환합니다.
합체 기능
예 :
Coalesce () 함수 의 가장 간단한 정의는 다음과 같습니다.
Coalesce () 함수는 전달 된 모든 인수를 평가 한 다음 NULL로 평가되지 않은 인수의 첫 번째 인스턴스 값을 반환합니다.
참고 : 모든 매개 변수를 평가합니다. 즉, 반환 된 / NOT NULL 매개 변수의 오른쪽에있는 인수 평가를 건너 뛰지 않습니다.
통사론:
Coalesce(arg1, arg2, argN...)
주의 : NULL로 평가되는 인수를 제외하고 다른 모든 (NOT-NULL) 인수는 동일한 데이터 유형이거나 일치하는 유형 이어야합니다 (호환되는 데이터 유형으로 "암묵적으로 자동 변환"될 수 있음). 예제 참조 이하:
PRINT COALESCE(NULL, ('str-'+'1'), 'x') --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3) --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99) --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31') --returns today's date, works fine as implicit conversion into DATE type occurs.
--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str') --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
HTH
ISNULL
표준이 아니고 유연성이 떨어지는를 사용하는 것에주의하십시오 . 첫 번째 인수의 데이터 유형을 항상 반환하고 반환 된 값의 데이터 유형은 반환하지 않는다는 것을 읽었습니다COALESCE
.