개발공작소
728x90

 

 

 

 

기본적으로 오라클에서 문자열을 자를 때 사용하는 함수가
SUBSTR함수 및 SUBSTRB함수를 사용한다. ( 나는 보통 SUBSTR함수를 사용함. )

 

 

[ 샘플 더미테이블 ]

-- 오늘은 DUAL 더미테이블을 이용하도록 하자.
SELECT * FROM (
	SELECT '고급_츄르츄르' AS "상품명", '1800원' AS "상품가격" from DUAL UNION ALL
	SELECT '열빙어' AS "상품명", '2500원' AS "상품가격" from DUAL
);

 

 

 

SUBSTR 함수

 

SUBSTR 함수는 "문자단위"로 시작위치와 자를 길이를 지정하여 문자열을 자른다.

기본문법 : SUBSTR("문자열", "시작위치", "길이")

 

1. 앞에서부터 문자열을 자르기

SELECT * FROM (
	-- 4번째 문자부터 길이가 4만큼 잘라서 SELECT함
    -- 고급_"츄"르츄르 => 츄르츄르
	SELECT SUBSTR('고급_츄르츄르',4,4) AS "상품명", '1800원' AS "상품가격" from DUAL UNION ALL
    -- 2번째 문자부터 길이가 2만큼 잘라서 SELECT함
    -- 열"빙"어 => 빙어
	SELECT SUBSTR('열빙어',2,2) AS "상품명", '2500원' AS "상품가격" from DUAL
);

 

2. 뒤에서부터 문자열을 자르기

SELECT * FROM (
	-- 뒤에서 4번째 문자부터 길이가 2만큼 잘라서 SELECT함
    -- 고급_"츄"르츄르 => 츄르
	SELECT SUBSTR('고급_츄르츄르',-4,2) AS "상품명", '1800원' AS "상품가격" from DUAL UNION ALL
    -- 뒤에서 3번째 문자부터 길이가 1만큼 잘라서 SELECT함
    -- "열"빙어 => 열
	SELECT SUBSTR('열빙어',-3,1) AS "상품명", '2500원' AS "상품가격" from DUAL
);

 

 

SUBSTRB 함수


SUBSTRB 함수는 "바이트 단위"로 문자열을 자를때 사용한다.

문자가 한글인 녀석을 SUBSTR함수를 이용하여 자를 때 한글이 깨지는 경우에
"바이트 단위"로 자르는 SUBSTRB함수를 사용한다. ( 근데 대부분 SUBSTR로 잘 됨.. ) 

 

 

1. 바이트 단위로 자르기 ( 시작열 )

SELECT * FROM (
	-- 앞에서 3바이트 부터 자름
    -- 고급_츄르츄르 =>  급_츄르츄르
	SELECT SUBSTRB('고급_츄르츄르',3) AS "상품명", '1800원' AS "상품가격" from DUAL UNION ALL
	-- 앞에서 3바이트 부터 자름
    -- 열빙어 =>  빙어
	SELECT SUBSTRB('열빙어',3) AS "상품명", '2500원' AS "상품가격" from DUAL UNION ALL
	-- 앞에서 3바이트 부터 자름
    -- Kanagan =>  nagan
	SELECT SUBSTRB('Kanagan',3) AS "상품명", '38000원' AS "상품가격" from DUAL
);

 

여기서 SUBSTR과 SUBSTRB의 차이점은 역시 "문자열"로 자르느냐, "바이트"로 자르느냐인데,

 

한글은 한글자당 2byte이고 영문은 한글자당 1byte이기 때문에

똑같이 인자를 3으로 줘도 결과값이 다르다. 왜 그런가 하면

 

영문은 정상적으로 3번째부터인 1번째+2번째 글자인 "Ka"를 건너뛰고 "nagan"이 출력되지만
한글은 글자당 2byte이기 때문에 1번째 글자인 "고"가 2byte를 잡아먹고 3byte인 "급" 부터 시작하는 것이다.
열빙어 또한 똑같다. "열"이 2byte를 잡아먹고 3byte부터인 "빙"부터 시작한다.

 

물론 아래와 같이 2번째 인자를 넣어서도 쓸 수 있다~

 

 

2. 바이트 단위로 자르기 ( 시작열, 길이 )

SELECT * FROM (
	-- 앞에서 3바이트 부터 7바이트 길이만큼 자름
    -- 고급_츄르츄르 =>  급_
	SELECT SUBSTRB('고급_츄르츄르',3,7) AS "상품명", '1800원' AS "상품가격" from DUAL UNION ALL
    -- 앞에서 3바이트 부터 7바이트 길이만큼 자름
    -- 열빙어 =>  빙어
	SELECT SUBSTRB('열빙어',3,7) AS "상품명", '2500원' AS "상품가격" from DUAL UNION ALL
    -- 앞에서 3바이트 부터 7바이트 길이만큼 자름
    -- Kanagan =>  na
	SELECT SUBSTRB('Kanagan',3,2) AS "상품명", '38000원' AS "상품가격" from DUAL
);

 

 

 

 

 

728x90
profile

개발공작소

@모찌바라기

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!