반응형
Split 함수 만들기 (문자열을 특정 구분자로 잘라보자)
DECLARE @pString VARCHAR(8000) = '120.20.2212.142' -- 문자열
DECLARE @pDelimiter CHAR(1) = '.' -- 구분자
;WITH E1(N) AS -- row 10
(
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL
SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1
),
E2(N) AS (SELECT 1 FROM E1 a, E1 b), -- row 100
E4(N) AS (SELECT 1 FROM E2 a, E2 b), -- row 10,000
cteTally(N) AS -- 문자열 만큼 row
(
SELECT TOP (ISNULL(DATALENGTH(@pString),0))
ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM E4
-- (ISNULL(DATALENGTH(@pString),0)) = 문자열 개수
-- ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) = 번호
),
cteStart(N1) AS -- 문자열 시작 위치 (구분자 다음)
(
SELECT 1
UNION ALL
SELECT t.N+1 FROM cteTally t WHERE SUBSTRING(@pString,t.N,1) = @pDelimiter
-- 각각의 문자 다음 문자가 구분자와 같은지 체크
-- 같으면 구분자 다음의 문자(t.N+1)를 가지고 온다.
),
cteLen(N1,L1) AS ( -- 문자열 시작 위치와 문자열 크기
SELECT s.N1
, ISNULL(NULLIF(CHARINDEX(@pDelimiter,@pString,s.N1) ,0) - s.N1,8000)
-- 구분자 부터 다음 구분자까지 몇개의 문자가 있는지 반환
-- N1 = 문자열 시작 위치
-- L1 = (구분자 시작 위치 - 구분자 전 문자열의 시작 위치) = 문자열 크기
/*
[참고]
NULLIF(변수,비교값) 변수를 비교값과 비교해서 값이 같으면 NULL을 반환
CHARINDEX(찾을문자,문자열,시작위치) 문자열에서 찾을문자의 위치를 반환
*/
FROM cteStart s
)
SELECT ItemNumber = ROW_NUMBER() OVER(ORDER BY l.N1),
Item = SUBSTRING(@pString, l.N1, l.L1)
-- item = 문자열 시작 위치부터 다음 구분자까지의 문자 반환
FROM cteLen l;
반응형
'프로그래밍 > MSSQL' 카테고리의 다른 글
[MSSQL] 트랜잭션 로그 보기 (0) | 2019.12.16 |
---|---|
[MSSQL] 로그인 등록/수정/삭제 (오류 암호의 유효성을 검사하지 못했습니다.) (0) | 2019.12.10 |
[MSSQL] TEXT 타입에 REPLACE 함수 적용 (0) | 2019.11.28 |
[MSSQL] COLLATE/COLLATION 데이터 정렬 (0) | 2019.11.28 |
[MSSQL] 테이블 '#테이블명'이(가) 없거나 권한이 없어서 삭제할 수 없습니다. (0) | 2019.11.27 |