database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 41466 게시물 읽기
No. 41466
안녕하세요... 고민 끝에 질문입니다.
작성자
이호수(reverse1990)
작성일
2017-10-11 14:50
조회수
5,606

안녕하세요. 

매번 막힐때마다 가끔 찾아오게 되네요.

제 실력으로는 시간만 낭비할 것 같아 질문드립니다.

 

잘못 넣어진 데이터를 수정을 해야 하는데요.

번호          상품명          구분                                                    번호              상품명          구분

1          사과,배,감          과일                                after               1                   사과             과일

2             포스틱             과자                               ----->               2                    배                과일

3      빠삐코,메로나     아이스크림                                              3                     감                과일

 

이런식으로 데이터가 들어가있습니다.

그런데 , (comma)로 상품명이 이어진 데이터들을 쪼개주어야 합니다. (위의 예시로 확실하죠...)

이어진 데이터들과 나머지 값은 동일하게 들어가되 콤마로만 구분되야 합니다.

 

쿼리로 수정을 해야할것같은데 어떻게 해야할까요?...

 

 

 

이 글에 대한 댓글이 총 6건 있습니다.

WITH t AS
(
SELECT 1 no, '사과,배,감' nm, '과일' gb  FROM dual
UNION ALL SELECT 2, '포스틱', '과자' FROM dual
UNION ALL SELECT 3, '빠삐코,메로나', '아이스크림' FROM dual
)
SELECT ROW_NUMBER() OVER(ORDER BY no, lv) no
     , REGEXP_SUBSTR(nm, '[^,]+', 1, lv) nm
     , gb
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(nm, ',') + 1
;

마농(manon94)님이 2017-10-11 15:31에 작성한 댓글입니다.

 마농님께 항상 도움만 받네요...!

매번 감사드립니다 ^^

이호수(reverse1990)님이 2017-10-12 10:22에 작성한 댓글입니다.

 마농님 질문 하나 더 드리겠습니다.

 

, 로 스플릿하는 방법에 대해서는 덕분에 알게되었습니다.

그런데, 만약에 이런 경우는 어떻게 처리하나요...

 

A,B(F,G),C,D 이렇게 있을 경우

A

B(F,G)

C

D

이렇게 스플릿을 해야 하는 경우도 있더라구요.

 

이런 경우는 어떻게 하면 될까요...?

이호수(reverse1990)님이 2017-10-12 15:47에 작성한 댓글입니다.

WITH t AS
(
SELECT 1 no, '사과,배,감' nm, '과일' gb  FROM dual
UNION ALL SELECT 2, '포스틱', '과자' FROM dual
UNION ALL SELECT 3, '빠삐코,메로나', '아이스크림' FROM dual
UNION ALL SELECT 4, 'A,B(F,G),C,D', 'ALPHA' FROM dual
UNION ALL SELECT 5, '가,나(냐,너,녀),다,라', '한글' FROM dual
)
SELECT ROW_NUMBER() OVER(ORDER BY no, lv) no
     , REGEXP_SUBSTR(nm, '[^!]+', 1, lv) nm
     , gb
  FROM (SELECT no, gb
             , REGEXP_REPLACE(','||nm, ',([^,(]+(\([^)]+\))?)', '!\1') nm
          FROM t
        )
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= REGEXP_COUNT(nm, '!')
;

마농(manon94)님이 2017-10-12 16:23에 작성한 댓글입니다.

 다시 한번 감사드립니다 ~ ^^

이호수(reverse1990)님이 2017-10-13 09:12에 작성한 댓글입니다.

select regexp_substr(nm,'([^,(]+)(\([^)]+\))?',1,lv)

from t

, (select level lv from dual connect by level <= 20)

where lv <= regexp_count(regexp_replace(nm,'([^,(]+)(\([^)]+\))?','\1'),',') + 1

order by no, lv

손재균(iikii)님이 2017-10-18 15:39에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41469토드 프로그램 패치 원리는 뭔가요? [1]
엑소
2017-10-18
5254
41468오라클 RAC 환경에서 리스너 패스워드 설정. 영향없을까요? [1]
유진우
2017-10-16
5306
41467정렬안의 정렬쿼리 [2]
gksalgml
2017-10-12
5399
41466안녕하세요... 고민 끝에 질문입니다. [6]
이호수
2017-10-11
5606
41465gorup 질문 입니다. [1]
봉달이
2017-10-10
5527
41464데이터 합계 처리 문의 드립니다. [4]
김태경
2017-09-29
5827
41463redo log 관련 질문입니다
goblin
2017-09-26
5487
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.053초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다