데이터 구분자로 나눠서 행으로 표시(질문) 0 4 937

by 이제시작이야 [SQL Query] 구분자 [2020.05.08 11:03:39]


화성시 금곡동 123-3, 123-1, 123-7, 123

경기도 시흥시 정왕동 234-4, 안산시 단원구 성곡동 345-2

위와같은 데이터들을

SELECT a.*
     , REGEXP_SUBSTR(addr, '[^,]+', 1, lv) v, lv
  FROM 주소 a
     , (SELECT LEVEL lv 
        FROM dual 
        CONNECT BY LEVEL <= 99)
 WHERE lv <= LENGTH(addr) - LENGTH(REPLACE(addr, ',')) + 1
 ORDER BY addr
;

위쿼리를 이용하여

addr                                                                         v

화성시 금곡동 123-3, 123-1, 123-7, 123                            123-1
화성시 금곡동 123-3, 123-1, 123-7, 123                            123
화성시 금곡동 123-3, 123-1, 123-7, 123                            123-7
화성시 금곡동 123-3, 123-1, 123-7, 123                            화성시 금곡동 123-3

경기도 시흥시 정왕동 234-4, 안산시 단원구 성곡동 345-2     안산시 단원구 성곡동 234-4
경기도 시흥시 정왕동 234-4, 안산시 단원구 성곡동 345-2     경기도 시흥시 정왕동 345-2

로 나눴습니다.

문제가 v컬럼의 데이터들을 전부 경기도 화성시 금곡동 123,경기도 화성시 금곡동 123-7,경기도 화성시 금곡동 123-3,경기도 화성시 금곡동 123-1

이런식으로 표현하고싶은데 방법을 모르겠습니다;;

고수님들의 조언을 부탁드려도 될까요?

by 마농 [2020.05.08 11:30:00]

두개의 샘플이 형태가 다르네요.
1번은 번지수만 나열된 형태이고.
2번은 전체 주소가 나열된 형태네요.
또 다른 형태는 없는지? 1,2번 혼합형태라던가?


by 이제시작이야 [2020.05.08 11:59:08]

시흥시 정왕동 567-7, 567-11, 경기도 안산시 단원구 성곡동 456-2 같은 형태는 있습니다.

추가적으로 전체주소로 변환이 어렵다면 번지만 남기는 방법이라도 알고싶습니다...


by 마농 [2020.05.08 13:24:43]
WITH addr AS
(
SELECT '화성시 금곡동 123-3, 123-1, 123-7, 123' addr FROM dual
UNION ALL SELECT '경기도 시흥시 정왕동 234-4, 안산시 단원구 성곡동 345-2' FROM dual
UNION ALL SELECT '경기도 시흥시 정왕동 234-7, 안산시 단원구 성곡동 345-3, 345-4' FROM dual
UNION ALL SELECT '시흥시 정왕동 567-7, 567-11, 경기도 안산시 단원구 성곡동 456-2' FROM dual
)
SELECT addr
     , lv
     , LAST_VALUE(SUBSTR(x, 1, y)) IGNORE NULLS OVER(PARTITION BY addr ORDER BY lv) addr1
     , SUBSTR(x, y + 1) addr2
  FROM (SELECT addr
             , lv
             , TRIM(REGEXP_SUBSTR(addr, '[^,]+', 1, lv)) x
             , REGEXP_INSTR(
               TRIM(REGEXP_SUBSTR(addr, '[^,]+', 1, lv))
               , ' [0-9]') y
          FROM addr
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
         WHERE lv <= LENGTH(addr) - LENGTH(REPLACE(addr, ',')) + 1
        )
;

 


by 이제시작이야 [2020.05.08 13:42:49]

이해조차 간신히했습니다...

제가 모르던 새로운 방법도 신기하지만

이 방법을 알았어도 마농님처럼은 못했을것같네요;;

오늘도 또한번 감탄하고갑니다.

감사합니다!

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