[sql] TSQL의 COALESCE 함수

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

COALESCE (x, y)

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



답변

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()하지 않습니다.


답변

제가 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 인 사람을 반환합니다.

합체 기능

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

예 :

  • coalesce (null, 1, 2, 3)은 1을 반환합니다.
  • coalesce (null, null)은 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


답변

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