TSQL의 COALESCE 함수


109

누군가 TSQL의 COALESCE 함수가 어떻게 작동하는지 설명 할 수 있습니까? 구문은 다음과 같습니다.

COALESCE (x, y)

이 기능에 대한 MSDN 문서는 매우 모호합니다.

답변:


74

COALESCE가 ISNULL보다 비용이 적게 든다는 말을 들었지만 연구 결과는 그렇지 않습니다. ISNULL은 두 개의 매개 변수, 즉 NULL로 평가되는 필드와 NULL로 평가되는 경우 원하는 결과 만 사용합니다. COALESCE는 임의의 수의 매개 변수를 사용하고 NULL이 아닌 첫 번째 값을 반환합니다.

자세한 내용은 http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/에 훨씬 더 자세한 설명이 있습니다 .


6
ISNULL표준이 아니고 유연성이 떨어지는를 사용하는 것에주의하십시오 . 첫 번째 인수의 데이터 유형을 항상 반환하고 반환 된 값의 데이터 유형은 반환하지 않는다는 것을 읽었습니다 COALESCE.
sprocket12

215

문서가 모호하다고 생각하는 이유를 잘 모르겠습니다.

단순히 모든 매개 변수를 하나씩 살펴보고 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()하지 않습니다.


4
+1 데이터 유형 우선 순위에 대한 설명입니다. ISNULL그래도 첫 번째 매개 변수와 동일한 데이터 유형의 값 을 반환 한다고 생각합니다.
Lamak

5
마지막 코드 예에서 'COALESCE에 대한 인수 중 하나 이상은 NULL 형식이어야합니다'라는 오류가 표시되어야합니다. 출처 : sql-server-performance.com/2007/…
maqk

2
문서는 거의 제로 가치를 제공하도록 관리하면서 많은 것을 말합니다. 좋은 문서는 간단한 결과와 함께 간단한 예제를 제공합니다. Coalesce는 즉시로 이동 expressions하여 CASE와 비교하고 ISNULL과 비교하고 마지막으로 결과가없는 예제로 이동합니다. 그런 다음 너무 많은 세부 사항이있는 지나치게 복잡한 예입니다. 우리가 필요로하는 것은 WTF 5-6 줄이있는이 대답뿐 일 때, 이것이 바로 그렇습니다.
P.Brian.Mackey


18

제가 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

4

ISNULL을 대체하는 것보다 더 많은 통합이 필요합니다. 통합의 공식 "문서"가 모호하고 도움이되지 않는다는 데 전적으로 동의합니다. 이 기사는 많은 도움이됩니다. http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/


3
귀하가 링크 한 해당 기사는 매우 오해의 소지가 있습니다 (댓글 섹션에서 작성자를 포함한 여러 사람이 지적했듯이). 그가 강조하는 모든 깔끔한 트릭은 합체 대신 ISNULL을 사용하여 모두 수행 할 수 있습니다.
호보 스파이더

3

다음은 통합을 포함하는 간단한 쿼리입니다.

select * from person where coalesce(addressId, ContactId) is null.

addressId와 contactId가 모두 null 인 사람을 반환합니다.

합체 기능

  • 최소한 두 개의 인수를 취합니다.
  • 인수는 정수 유형이어야합니다.
  • null이 아닌 첫 번째 인수를 반환합니다.

예 :

  • coalesce (null, 1, 2, 3)은 1을 반환합니다.
  • coalesce (null, null)은 null을 반환합니다.

1

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


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

1
나는 이것이 훨씬 더 간단하다는 것을 알았다.
Xiao
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.