MS SQL Server 에서 T-SQL 작성시, 가끔 여러 row들의 column 값을 특정 문자로 연결해서 사용해야할 경우가 있다.
CURSOR를 사용하거나, 반복문을 돌면서 연결할 수 있겠지만, SELECT 구문 하나로 해결할 수 있다.
1. ISNULL() 사용
- Contacts table에 고객들의 정보가 저장되어 있다.
- 고객의 Last Name (성)이 "Kelly"로 끝나는 사람들을 찾아서, comma로 연결해서 보여주어야할때를 가정해보자.
DECLARE @ContactList NVARCHAR(MAX); SELECT Top 10 @ContactList = ISNULL(@ContactList + ', ', '') + FullName FROM dbo.Contacts WHERE IsActive = 1 AND FullName LIKE '%Kelly' ORDER BY FullName; SELECT @ContactList; |
- 고객의 Last Name (성)이 "Kelly"로 끝나는 사람들을 찾아서, new line(char(13) + char(10)) 문자로 연결해서 보여주어야할때를 가정해보자. new line을 확인하기 위해서, SELECT가 아닌 PRINT 구문으로 결과를 확인해보자.
DECLARE @ContactList NVARCHAR(MAX); SELECT Top 10 @ContactList = ISNULL(@ContactList + CHAR(13) + CHAR(10), '') + FullName FROM dbo.Contacts WHERE IsActive = 1 AND FullName LIKE '%Kelly' ORDER BY FullName; PRINT @ContactList; |
2. COALESCE() 사용
- ISNULL() 과 COALESCE()의 차이점은?
바로 NULL인 경우 사용할 값을 지정하는 개수이다.
ISNULL()은 두번째 parameter에 NULL인 경우 사용할 값을 지정한다. 딱 1개만 지정할 수 있다.
COALESCE()는 NULL인 경우 사용할 값을 사용하고 싶은 만큼 두번째 parameter부터 지정할 수 있다.
예를 들면, Column1이 NULL이면, Column2를 사용하고, Column2가 또 NULL이면 Column3를 사용하도록 지정하는 식이다.
COALESCE(Column1, Column2, Column3)
* 참고)
COALESCE (Transact-SQL) - SQL Server
Transact-SQL reference for COALESCE, which returns the value of the first expression that does not evaluate to NULL.
learn.microsoft.com
COALESCE(Transact-SQL) - SQL Server
NULL로 계산되지 않는 첫 번째 식의 값을 반환하는 COALESCE의 Transact-SQL 참조입니다.
learn.microsoft.com
- 고객의 Last Name (성)이 "Kelly"로 끝나는 사람들을 찾아서, comma로 연결해서 보여주어야할때를 가정해보자.
DECLARE @ContactList NVARCHAR(MAX); SELECT Top 10 @ContactList = COALESCE(@ContactList + ', ', '') + FullName FROM dbo.Contacts WHERE IsActive = 1 AND FullName LIKE '%Kelly' ORDER BY FullName; SELECT @ContactList; |
- 고객의 Last Name (성)이 "Kelly"로 끝나는 사람들을 찾아서, new line(char(13) + char(10)) 문자로 연결해서 보여주어야할때를 가정해보자. new line을 확인하기 위해서, SELECT가 아닌 PRINT 구문으로 결과를 확인해보자.
DECLARE @ContactList NVARCHAR(MAX); SELECT Top 10 @ContactList = COALESCE(@ContactList + CHAR(13) + CHAR(10), '') + FullName FROM dbo.Contacts WHERE IsActive = 1 AND FullName LIKE '%Kelly' ORDER BY FullName; PRINT @ContactList; |