본문 바로가기
IT공부/MS SQL Server

CURSOR, 반복문 사용 없이, 여러개의 row column 값들을 특정 문자로 연결해서 한번에 변수에 저장하기

by 따뜻한 위로가 될수 있길 2023. 4. 27.

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;