복붙노트

[SQL] 구분 위치에 의해 분할 문자열 오라클 SQL을 사용하여

SQL

구분 위치에 의해 분할 문자열 오라클 SQL을 사용하여

나는 문자열을 가지고 있고 특정 위치에 구분하여 해당 문자열을 분할하고 싶습니다.

예를 들어, 내 문자열 F / P / O와 I가 찾고 있어요 결과입니다 :

따라서, 나는 먼 구분하여 문자열을 분리하고 싶습니다. 참고 : 내 문자열의 일부는 내 작품 벌금 아래 SQL 및 반환 결과를 원하는되는 F / O입니다.

다음과 같이 SQL I는 썼다 :

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

그 결과는 다음과 같습니다

왜 이런 일이 일어나고이며 어떻게 해결할 수 있습니까?

해결법

  1. ==============================

    1.이를 위해 () REGEXP_SUBSTR를 사용하고 싶습니다. 이것은 당신의 예를 들어 작동합니다 :

    이를 위해 () 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 바이올린입니다.

    아차. 나는 그것이 마지막 구분 기호를 말한다 질문의 일부를 놓쳤다. 이를 위해, 우리는 첫 번째 부분에 대한 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 바이올린입니다.

  2. ==============================

    2.나는이 오래된 질문이다 알지만,이 SUBSTR과 INSTR이 충분있는 간단한 요구 사항입니다. 정규 표현식은 여전히 ​​느리고 이전 SUBSTR 이상과 기능 INSTR CPU 집약적 인 작업이다.

    나는이 오래된 질문이다 알지만,이 SUBSTR과 INSTR이 충분있는 간단한 요구 사항입니다. 정규 표현식은 여전히 ​​느리고 이전 SUBSTR 이상과 기능 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 번호를 백업하고.

  3. from https://stackoverflow.com/questions/26878291/split-string-by-delimiter-position-using-oracle-sql by cc-by-sa and MIT license