programing

Oracle SQL을 사용하여 구분자 위치별로 문자열 분할

newnotes 2023. 3. 11. 09:25
반응형

Oracle SQL을 사용하여 구분자 위치별로 문자열 분할

문자열이 있는데 특정 위치에서 구분 기호로 해당 문자열을 분할하려고 합니다.

예를 들어 my String은F/P/O그리고 제가 원하는 결과는 다음과 같습니다.

원하는 결과의 스크린샷

따라서 문자열을 가장 먼 딜리미터로 구분하고 싶습니다.
주의: 일부 문자열은F/O또한 아래 SQL은 정상적으로 작동하고 원하는 결과를 반환합니다.

작성한 SQL은 다음과 같습니다.

SELECT Substr('F/P/O', 1, Instr('F/P/O', '/') - 1) part1, 
       Substr('F/P/O', Instr('F/P/O', '/') + 1)    part2 
FROM   dual

결과는 다음과 같습니다.

예기치 않은 결과 스크린샷

이 문제는 왜 발생하며 어떻게 해결할 수 있습니까?

따라서 문자열을 가장 먼 딜리미터로 구분하고 싶습니다.

오래된 질문인 것은 알지만, 이것은 기판과 INSTR충분한 단순한 요건입니다.REGEXP오래된 subtsr 및 instr 기능보다 여전히 느리고 CPU 부하가 높은 동작입니다.

SQL> WITH DATA AS
  2    ( SELECT 'F/P/O' str FROM dual
  3    )
  4  SELECT SUBSTR(str, 1, Instr(str, '/', -1, 1) -1) part1,
  5         SUBSTR(str, Instr(str, '/', -1, 1) +1) part2
  6  FROM DATA
  7  /

PART1 PART2
----- -----
F/P   O

가장 딜리미터가 필요하다고 하셨듯이, 첫 번째 딜리미터와 그 반대입니다.

접근은 괜찮았지만 INSTR에서 start_position을 놓쳤습니다.start_position이 의 경우INSTR함수는 start_position number를 문자열의 끝에서 카운트하여 문자열의 선두를 검색합니다.

사용하고 싶다regexp_substr()이걸 위해서.이것은, 다음의 예에 유효합니다.

select regexp_substr(val, '[^/]+/[^/]+', 1, 1) as part1,
       regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t

참고로 여기 SQL Fielle이 있습니다.

, 마지막 딜리미터가 나오는 부분을 놓쳤네요.그러기 위해서는regex_replace()첫 번째 부분:

select regexp_replace(val, '/[^/]+$', '', 1, 1) as part1,
       regexp_substr(val, '[^/]+$', 1, 1) as part2
from (select 'F/P/O' as val from dual) t

여기에 대응하는 SQL Fielle이 있습니다.

언급URL : https://stackoverflow.com/questions/26878291/split-string-by-delimiter-position-using-oracle-sql

반응형