MS-SQL에 SPLIT 함수가 별도 존재하지 않으므로 직접 만들어 사용해야 한다.
입력된 문자열의 ':' 기준으로 문자열을 자른다면 아래 쿼리를 통해 구현할 수 있다.
DECLARE @IN_STR VARCHAR(100) = 'SECTION1.SECTION2.SECTION3:1234:2345:6789';
SELECT SUBSTRING(@IN_STR, 1, CHARINDEX(':', @IN_STR) - 1) AS [앞부분]
, RIGHT(@IN_STR, LEN(@IN_STR) - CHARINDEX(':', @IN_STR)) AS [뒷부분];
SUBSTRING : 문자열의 시작 위치부터 일정 영역만큼 잘라내어 반환하다.
CHARINDEX : 문자열에서 특정 문자의 위치를 반환한다.
RIGHT, LEFT : 문자열을 받아서 오른쪽/왼쪽부터 원하는 길이만큼 잘라 반환한다.
단순하게 사용시 위 로직으로도 충분하지만, 스플릿할 문자가 여러 개인 경우에 로직이 복잡해질 수 있다.
이를 위해 자주 사용하는 함수를 만들어보았다.
CREATE FUNCTION [dbo].[UFN_SPLIT]
(
@IN_STR VARCHAR(MAX), /* 문자열 */
@IDX INT, /* 추출순번 */
@SEPARATOR VARCHAR(10) = ',' /* SPLIT 기준문자 */
)
RETURNS VARCHAR(200)
AS
BEGIN
DECLARE @TEMP_STR VARCHAR(200)
DECLARE @CUR_STR VARCHAR(200)
DECLARE @CUR_SEPARATOR VARCHAR(10)
DECLARE @I INT
SET @TEMP_STR = '';
SET @I = 1;
SET @CUR_SEPARATOR = LTRIM(RTRIM(@SEPARATOR));
SET @CUR_STR = LTRIM(RTRIM(@IN_STR)) + @CUR_SEPARATOR; -- 마지막 문자 파싱하기 위해 맨 뒤에 separator 추가
IF CHARINDEX(@CUR_SEPARATOR, @IN_STR) > 0
BEGIN
WHILE @IDX >= @I
BEGIN
IF CHARINDEX(@CUR_SEPARATOR, @CUR_STR) > 0
BEGIN
-- 문자열 스플릿
SET @TEMP_STR = SUBSTRING(@CUR_STR, 1, CHARINDEX(@CUR_SEPARATOR, @CUR_STR) - 1);
-- 반환될 문자는 버린후 좌우공백 제거
SET @CUR_STR = RIGHT(@CUR_STR, LEN(@CUR_STR) - (LEN(@TEMP_STR) + LEN(@SEPARATOR)));
END
ELSE
BEGIN
SET @TEMP_STR = ''
END
SET @I = @I + 1
END
END
ELSE
BEGIN
SET @TEMP_STR = @IN_STR
END
RETURN(@TEMP_STR)
END
GO
도전 과제
입력 문자열에 'section1 /section2/section3' 형식으로 사이에 공백이 들어간 경우, 제대로 동작하지 않는다.
로직 중 LEN 함수는 입력된 문자열의 맨 뒤에 입력된 공백을 카운트하지 않기 때문으로 보인다.
참고 사항
SQL Server 2016 부터 STRING_SPLIT 함수가 추가되어, 컬럼 문자열의 구분자를 행으로 분리할 수 있게 되었다.
'데이터베이스 > MS-SQL' 카테고리의 다른 글
부분 문자열 SUBSTRING, LEFT, RIGHT, CHARINDEX 함수 (0) | 2024.02.05 |
---|---|
VARCHAR 가변 문자열 타입의 'hh:mm' 데이터 합계 구하기 (0) | 2024.02.05 |