develop

INSTR. 구분자로 문자가 여러개 붙어 있을 때.

파드파드 2022. 1. 24. 14:06
반응형

1. 배경

특정문자로 컬럼들을 합쳐서 하나로 만든 후 다시 컬럼별로 나눌려고 하는데,

INSTR로 분리 할려고 하다가 쓰는 글.

 

2. 동일내용의 반복. 피라미드 ㅎㅎ. 너무길다.

SELECT a, b, c, d, e, f, g, SUBSTR(col1, 1, INSTR(col1, '#')-1) h, SUBSTR(col1, INSTR(col1, '#')+ 1) col1  
FROM (
  SELECT a, b, c, d, e, f, SUBSTR(col1, 1, INSTR(col1, '#')-1) g, SUBSTR(col1, INSTR(col1, '#')+ 1) col1  
  FROM (
    SELECT a, b, c, d, e, SUBSTR(col1, 1, INSTR(col1, '#')-1) f, SUBSTR(col1, INSTR(col1, '#')+ 1) col1  
    FROM (
      SELECT a, b, c, d, SUBSTR(col1, 1, INSTR(col1, '#')-1) e, SUBSTR(col1, INSTR(col1, '#')+ 1) col1  
      FROM (
        SELECT a, b, c, SUBSTR(col1, 1, INSTR(col1, '#')-1) d, SUBSTR(col1, INSTR(col1, '#')+ 1) col1  
        FROM (
          SELECT a, b, SUBSTR(col1, 1, INSTR(col1, '#')-1) c, SUBSTR(col1, INSTR(col1, '#')+ 1) col1 
          FROM (
            SELECT a, SUBSTR(col1, 1, INSTR(col1, '#')-1) b, SUBSTR(col1, INSTR(col1, '#')+ 1) col1
            FROM (
              SELECT SUBSTR(col1, 1, INSTR(col1, '#')-1) a, SUBSTR(col1, INSTR(col1, '#')+ 1) col1
              FROM (
                  SELECT 'abc#123#def#45#gH#678#IJK#90#LMN' AS col1
                  FROM dual
              )
            )
          )
        )
      )
    )
  )    
)  
;

 

3. 특정문자가 나오는 순서를 사용. 괜찮네.
SELECT col1, SUBSTR(col1, 1, INSTR(col1, '#')-1) a
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 1) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 1) + 1), '#')-1) b
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 2) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 2) + 1), '#')-1) c
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 3) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 3) + 1), '#')-1) d
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 4) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 4) + 1), '#')-1) e
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 5) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 5) + 1), '#')-1) f
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 6) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 6) + 1), '#')-1) g
, SUBSTR(SUBSTR(col1, INSTR(col1, '#', 1, 7) + 1), 1, INSTR(SUBSTR(col1, INSTR(col1, '#', 1, 7) + 1), '#')-1) h
, SUBSTR(col1, INSTR(col1, '#', 1, 8) + 1) i
--, LENGTH(col1)
FROM (
    SELECT 'abc#123#def#45#gH#678#IJK#90#LMN' AS col1
    FROM dual
)
;

 

4. INSTR은 무슨. REGEXP_SUBSTR 이게 제일 좋아.
SELECT 
  REGEXP_SUBSTR(col1, '[^#]+', 1, 1) a
, REGEXP_SUBSTR(col1, '[^#]+', 1, 2) b
, REGEXP_SUBSTR(col1, '[^#]+', 1, 3) c
, REGEXP_SUBSTR(col1, '[^#]+', 1, 4) d
, REGEXP_SUBSTR(col1, '[^#]+', 1, 5) e
, REGEXP_SUBSTR(col1, '[^#]+', 1, 6) f
, REGEXP_SUBSTR(col1, '[^#]+', 1, 7) g
, REGEXP_SUBSTR(col1, '[^#]+', 1, 8) h
, REGEXP_SUBSTR(col1, '[^#]+', 1, 9) i
FROM (
  SELECT 'abc#123#def#45#gH#678#IJK#90#LMN' AS col1
  FROM dual
)
;

 

5. 결국은 리소스 많이 잡아서 사용 안함.

그래서 성능은 REGEXP_SUBSTR 이게 최고!

 

끝.

반응형