안녕하십니까, 고수님들
특정문자 기준으로, 문자를 가져오는데...데이터가 많을 수록 속도 문제가 있는거 같습니다
다른 방법이 있을까요
select regexp_sustr(regexp_replace(:tezt_vl, '[^_0-9]', '', 1), '[^_], 1, 1) -- 8888_99 --> 8888
, regexp_sustr(regexp_replace(:tezt_vl, '[^_0-9]', '', 1), '[^_], 1, 2) -- 8888_99 --> 99
from dual
○ 두가지 변환과정이 있네요.
1. 숫자와 언더바가 아닌 문자 제거
2. 언더바를 기준으로 앞,뒤 문자 추출
○ 정규식 때문에 느리다면? 정규식이 아닌 일반 함수를 사용해 보세요.
1. 숫자와 언더바가 아닌 문자 제거 -> TRANSLATE
2. 언더바를 기준으로 앞,뒤 문자 추출 -> SUBSTR & INSTR
WITH t AS
(
SELECT '8888_99' tezt_vl FROM dual
UNION ALL SELECT 'a8888_99b' FROM dual
UNION ALL SELECT '8888' FROM dual
)
SELECT tezt_vl
, REGEXP_SUBSTR(REGEXP_REPLACE(tezt_vl, '[^_0-9]'), '[^_]+', 1, 1) v1
, REGEXP_SUBSTR(REGEXP_REPLACE(tezt_vl, '[^_0-9]'), '[^_]+', 1, 2) v2
, TRANSLATE(SUBSTR(tezt_vl, 1, INSTR(tezt_vl||'_', '_') - 1), '_0123456789'||tezt_vl, '_0123456789') x1
, TRANSLATE(SUBSTR(tezt_vl, INSTR(tezt_vl||'_', '_') + 1), '_0123456789'||tezt_vl, '_0123456789') x2
FROM t
;