반응형

 

컬럼의 내용을 특정 문자열을 추가해서 조인 함수를 만들고 싶다.

 

생성하고자 하는 이유는

특정 행을 예외처리하기 위해서 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 알아보자.

 

[SQL] NULL체크 함수, ISNULL/COALESCE 알아보자.

데이터를 조회할때, 컬럼 혹은 변수에 값이 없으면 NULL값이 조회된다. NULL은 예외사항이 많기 때문에 항상 체크해야한다. (우리는 NULL값을 원하지 않으니.) 그래서 SQL 내장함수로, ISNULL / COALESCE 함수가..

im-first-rate.tistory.com

SELECT를 하면,

첫 행에서는 @except_num값은 NULL이기 때문에 빈 값('')이 채워지고,

첫 번째 행의 num 값만 @except_num에 들어갈 것이다.

그다음 행부터는 @except_num값에 데이터가 들어가 있기 때문에, ','와 해당 행의 num 값이 순차적으로 들어가게 된다.

 

샘플데이터를 이용해서, usable=1일때와 usable=2일 때 해당 num값을 @except_num 변수에 넣어보았다.

C# / Javascript에는 Join이라는 함수를 사용하면 편리하지만,

SQL는 동일한 함수가 존재하지 않아 해당 방법을 사용하였다.

 

반응형

+ Recent posts