컬럼의 내용을 특정 문자열을 추가해서 조인 함수를 만들고 싶다.
생성하고자 하는 이유는
특정 행을 예외처리하기 위해서 NOT IN 연산자를 사용하려고 한다.
그래서 NOT IN (1,2,3,4,5) 혹은 NOT IN ('1','2','3','4','5') 형태의 데이터가 필요했다.
사실 후자보다는 전자의 모습이 필요했다. (PK값이 대부분 정수형 값이기 때문)
바로 샘플 코드를 보면서 확인해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
-- 테이블 생성
DECLARE @except AS TABLE (
num INT IDENTITY PRIMARY KEY, -- 키
usable TINYINT NOT NULL -- 상태값
)
-- 샘플 데이터
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(2);
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(2);
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(2);
INSERT INTO @except (usable) VALUES(1);
INSERT INTO @except (usable) VALUES(2);
-- 데이터 조회
SELECT *
FROM @except;
-- 조인(Join)할 문자열
DECLARE @except_num NVARCHAR(MAX);
SELECT @except_num = COALESCE(@except_num+',', '') + CONVERT(varchar(20), num)
FROM @except
WHERE usable = 2;
-- 조인(Join) 결과 조회
SELECT @except_num;
|
cs |
PK값인 num과 상태값을 나타내는 usable 컬럼이 있는 샘플 테이블을 생성했다.
그리고 Join을 하기 위해서 @except_num 변수를 생성했다.
27번째 라인이 핵심이다.
COALESCE는 순차적으로 NULL값을 대체하는 함수이다. COALESCE함수 대신 ISNULL함수를 사용해도 무방하다.
NULL 체크 함수에 대한 내용은, 아래글을 참조하자.
2020/01/31 - [개발/MSSQL] - [SQL] NULL체크 함수, ISNULL/COALESCE 알아보자.
SELECT를 하면,
첫 행에서는 @except_num값은 NULL이기 때문에 빈 값('')이 채워지고,
첫 번째 행의 num 값만 @except_num에 들어갈 것이다.
그다음 행부터는 @except_num값에 데이터가 들어가 있기 때문에, ','와 해당 행의 num 값이 순차적으로 들어가게 된다.
샘플데이터를 이용해서, usable=1일때와 usable=2일 때 해당 num값을 @except_num 변수에 넣어보았다.
C# / Javascript에는 Join이라는 함수를 사용하면 편리하지만,
SQL는 동일한 함수가 존재하지 않아 해당 방법을 사용하였다.
'개발 > MSSQL' 카테고리의 다른 글
[SQL] PIVOT에 대해 알아보고, 꿀팁도 얻어가자. (2) | 2020.06.25 |
---|---|
[SQL] 데이터 정렬(COLLATE) 변경 방법에 대해 알아보자. (2) | 2020.04.29 |
[SQL] 엑셀(EXCEL) 데이터 DBMS에 가져오기. (7) | 2020.03.09 |
[SQL] SELECT(조회)할 때, 컬럼 NVARCHAR(MAX)를 조심하자. (2) | 2020.03.06 |
[SQL] 최소~최대 까지 랜덤 숫자 가져오기. (2) | 2020.02.17 |