정규식 질문 드립니다 0 4 2,465

by 진어이 [Oracle 기초] oracle regexp_substr [2019.11.20 10:31:55]


안녕하세요! 쿼리 작성 도중 풀리지 않는 문제가 있어 질문드립니다.

SELECT regexp_substr(v, '[^(::)]+', 1, 1 ) as a
    ,regexp_substr(v, '[^(::)]+', 1, 2 ) as b
    ,regexp_substr(v, '[^(::)]+', 1, 3 ) as c
    ,regexp_substr(v, '[^(::)]+', 1, 4 ) as d
    ,regexp_substr(v, '[^(::)]+', 1, 5 ) as e
  FROM (SELECT 'a::b:::::b-1::c:c-1:c-2' v FROM dual);
  
  해당쿼리인데요..

문자열을 구분하려고 하고,, 문자열의  : 의 갯수가 랜덤할 수 있습니다.
  
  예로 들면 a::b:::::b-1::c:c-1:c-2 라고 할때 
  위 쿼리처럼 정규식으로 문자열 구분 시
  
  a
  b
  b-1
  c
  c-1
  
  로 노출됩니다.
  
  제가 원하는 것은
  a
  b:::::b-1
  c:c-1:c-2
  
  입니다.

  
  : 의 개수가 꼭 2개일때만 (::) 구분자로 사용하고싶습니다. 
  정규식으로 어떻게 작성해야 할까요?
  알려주시면 감사드리겠습니다.ㅠㅠ

by jkson [2019.11.20 10:54:50]
SELECT REGEXP_SUBSTR(V,'[^^]+',1,1) AS A

,REGEXP_SUBSTR(V,'[^^]+',1,2) AS B

,REGEXP_SUBSTR(V,'[^^]+',1,3) AS C

FROM

(
SELECT REGEXP_REPLACE(V,'([^:])(:{2})([^:])','\1^\3') AS V

FROM (SELECT 'a::b:::::b-1::c:c-1:c-2' V FROM DUAL)

)
-- 잘 되려나요?

 


by 진어이 [2019.11.20 12:58:11]

답변 감사합니당!

쿼리의 문자열은 예시로 들었지만 원래는 사용자가 입력하는 값이라 어떤 특수문자가 올지 몰라서

혹시나 제가 replace 해놓은 특수문자를 입력했을 경우 또 문제가 되더라구여..

더 연구해봐야할것 같습니다.

감사합니다!


by jkson [2019.11.20 13:02:39]

그럼 구분자 특수문자를 아예 사용자들이 절대로 안 쓸만한 걸로 쓰세요.

SELECT regexp_substr(v, '[^§]+', 1, 1 ) as a
    ,regexp_substr(v, '[^§]+', 1, 2 ) as b
    ,regexp_substr(v, '[^§]+', 1, 3 ) as c
    ,regexp_substr(v, '[^§]+', 1, 4 ) as d
    ,regexp_substr(v, '[^§]+', 1, 5 ) as e
  FROM (SELECT 'a§b:::::b-1§c:c-1:c-2' v FROM dual);


by 진어이 [2019.11.20 13:07:10]

오왓 저런것도 있네요?? 

바보같지만.. 당연히 저런 특수문자는 쓰면 안될줄........ㅠㅠ..

감사합니다 좋은 답변이 되었습니다!!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입