MSSQL Tips
여러가지 ROW를 하나의 ROW로 만들기
ID | Title |
---|---|
1 | 가 |
1 | 나 |
1 | 다 |
1 | 라 |
2 | 마 |
2 | 바 |
2 | 사 |
2 | 아 |
3 | 자 |
위와같은 테이블이 있습니다.
ID를 기준으로 Title의 텍스트를 comma(,)로 구분지어서 하나의 ROW로 합치고 싶을때 아래 쿼리를 사용합니다.
SELECT DISTINCT
ID,
STUFF((
SELECT ',' + Title
FROM TB_Data b
WHERE b.ID = a.ID
FOR XML PATH('')
),1,1,'') AS NAME
FROM TB_Data a
아래와 같은 결과가 출력됩니다.
ID | Title |
---|---|
1 | 가,나,다,라 |
2 | 마,바,사,아,자 |
STUFF?? FOR XML PATH??
STUFF함수
SUTFF함수는 문자열에서 특정 시작위치에서 지정된 길이만큼 문자를 바꿔줍니다.
SELECT STUFF('CASTLE',3,4,'P')
위 문자열에 대한 치환 결과로 CAP라는 값이 리턴됩니다.
FOR XML PATH
XML기능은 SELECT 문장에 FOR XML절을 추가하여 데이터베이스 엔진에서 쿼리결과를 XML형식으로 반환하도록 지정하거나 할 수 있는 기능입니다.
위 예제에서는 XML 기능의 여러 모드들 중 PATH 모드를 사용하였습니다.
PATH 모드를 추가 할 경우 SELECT되는 각 값마다 PATH()함수에 지정하는 태그로 감쌀수가 있습니다.
ex) FOR XML PATH('ID')일 경우
<ID>,가</ID><ID>,나</ID><ID>,다</ID><ID>,라</ID>.....
하지만 PATH()함수에 태그명이 공백으로(‘’)들어갈 경우 아래와 같이 값이 나옵니다.
ex) FOR XML PATH('')일 경우
,가,나,다,라....
위 예제에서는 이렇게 떨어진 값에 STUFF함수로 맨앞에 ,를 제거하여 우리가 목적으로 하는 값을 리턴합니다.