답변:
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.