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 40520 게시물 읽기
No. 40520
코드 검증관련 쿼리문의
작성자
량디(fidele)
작성일
2014-07-08 14:37
조회수
7,529

안녕하세요...코드 검증관련 쿼리를 하다 문의 드립니다.

 

 

db에 저장된 코드값을 검증해 보려 하는데 db 데이터는 코드값을 comma로 분리해 저장을 해 두었습니다.

 

 

코드 테이블의 값으 아래와 같으며

01, 02, 03, 04, 05, 06

 

실제 테이블에는 아래와 같이

 

03,02

01,04,06

01,05 이런식으로 들어가 있습니다.

 

쿼리로 실 테이블에 들어있는 값들이 코드값에 없는 데이터를 찾아 보려 하는데

콤마를 어떻게 잘라서 하긴 해야 할텐데..

 

쉬운 방법 있으면 답변좀 부탁 드립니다.

 

 

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

WITH code_t AS
(
SELECT '01, 02, 03, 04, 05, 06' cd FROM dual
)
, data_t AS
(
SELECT '03,02' cd FROM dual
UNION ALL SELECT '01,04,06' FROM dual
UNION ALL SELECT '01,05'    FROM dual
UNION ALL SELECT '02,07,99'    FROM dual
)
SELECT a.*
  FROM (SELECT cd
             , lv
             , REGEXP_SUBSTR(cd, '[^, ]+', 1, lv) cd1
          FROM data_t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL < 99)
         WHERE lv <= REGEXP_COUNT(cd, ',') + 1
        ) a
     , code_t b
 WHERE INSTR(b.cd, a.cd1) = 0
;

마농(manon94)님이 2014-07-08 18:14에 작성한 댓글입니다.

WITH code_t AS
(
SELECT '01, 02, 03, 04, 05, 06' cd FROM dual
)
, data_t AS
(
SELECT '03,02' cd FROM dual
UNION ALL SELECT '01,04,06' FROM dual
UNION ALL SELECT '01,05'    FROM dual
UNION ALL SELECT '01,07,03,99'    FROM dual
UNION ALL SELECT '02,07,99'    FROM dual
)
SELECT *
  FROM (SELECT d.cd
             , LTRIM(
               REGEXP_REPLACE(
               REGEXP_REPLACE(d.cd, REPLACE(c.cd, ', ', '|'))
               , ',+', ',')
               , ',') error_cd
          FROM data_t d
             , code_t c
        )
 WHERE error_cd IS NOT NULL
;

마농(manon94)님이 2014-07-08 18:21에 작성한 댓글입니다.

마농님 답변 감사합니다...

근데 쿼리가 잘 이해가 안가네요... 답변 주신 자료로 돌려보니

에러난 코드가 제대로 잡아지기는 합니다.

 

 

제가 코드테이블에 대해 잘못 전달을 했나보네요...

코드 테이블의 데이타가 로우단위로 있습니다... 다음과 같이.

 

 

WITH code_t AS

(

SELECT '01' cd FROM dual

UNION ALL SELECT '02' cd FROM dual

UNION ALL SELECT '03' cd FROM dual

UNION ALL SELECT '04' cd FROM dual

UNION ALL SELECT '06' cd FROM dual

UNION ALL SELECT '99' cd FROM dual

)

, data_t AS

(

SELECT '03,02' cd FROM dual

UNION ALL SELECT '01,04,06' FROM dual

UNION ALL SELECT '01,05' FROM dual

UNION ALL SELECT '01,07,03,99' FROM dual

UNION ALL SELECT '01' FROM dual

UNION ALL SELECT '02,07,99' FROM dual

)

SELECT *

FROM (SELECT d.cd

, LTRIM(

REGEXP_REPLACE(

REGEXP_REPLACE(d.cd, REPLACE(c.cd, ', ', '|'))

, ',+', ',')

, ',') error_cd

FROM data_t d

, code_t c

)

WHERE error_cd IS NOT NULL

;

 

 

위 같은 경우는 어떻게 처리해야 하는지요??

어렵네요... 이같은 쿼리는

량디(fidele)님이 2014-07-08 20:24에 작성한 댓글입니다.

-- 1. 데이터 Split, 아우터조인, 널체크  --
SELECT a.*
  FROM (SELECT cd
             , lv
             , REGEXP_SUBSTR(cd, '[^, ]+', 1, lv) cd1
          FROM data_t
             , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL < 99)
         WHERE lv <= REGEXP_COUNT(cd, ',') + 1
        ) a
     , code_t b
 WHERE a.cd1 = b.cd(+)
   AND b.cd IS NULL
;
-- 2. 정규식을 이용한 매칭자료 제거 --
SELECT *
  FROM (SELECT d.cd
             , LTRIM(
               REGEXP_REPLACE(
               REGEXP_REPLACE(d.cd, c.cd)
               , ',+', ',')
               , ',') error_cd
          FROM data_t d
             , (SELECT LISTAGG(cd, '|') WITHIN GROUP(ORDER BY cd) cd
                  FROM code_t) c
        )
 WHERE error_cd IS NOT NULL
;

마농(manon94)님이 2014-07-09 09:07에 작성한 댓글입니다.
이 댓글은 2014-07-09 09:08에 마지막으로 수정되었습니다.

어제도 늦게까지 해보다 잘 안되었네요..

 

마농님 항상 감사하게 생각합니다.

 

바로 분석해보고 테스트 해 보겠습니다~

 

 

량디(fidele)님이 2014-07-09 09:19에 작성한 댓글입니다.

마농님... 쿼리는 다 이해하고 적용해 봤습니다.

이상없이 잘 되네요.. 감사합니다.

 

근데 아래 부분이 좀 이해가 안되서 다시한번 여쭙니다..

 

아래중 REGEXP_REPLACE('', ',+', ',') 이부분은 어떤 의미인지요?

 

 

SELECT *

FROM (SELECT d.cd

, LTRIM(

REGEXP_REPLACE( <------- 요부분

REGEXP_REPLACE(d.cd, c.cd)

, ',+', ',') <------- 요부분

, ',') error_cd

FROM data_t d

, (SELECT LISTAGG(cd, '|') WITHIN GROUP(ORDER BY cd) cd

FROM code_t) c

)

WHERE error_cd IS NOT NULL

 

량디(fidele)님이 2014-07-09 11:01에 작성한 댓글입니다.

REGEXP_REPLACE('', ',+', ',')
이부분이 이해가 안가신다면?
이부분만 빼고 조회해보시면 이해가 가실 듯 합니다.
더 나아가서는 단계별로 쪼개서 조회해 보시는 게 좋지요.
==> 연속된 컴마(',+')를 하나의 컴마(',')로 변경

마농(manon94)님이 2014-07-09 11:40에 작성한 댓글입니다.

아... 그렇군요.데이터 돌려가면서 확인해 보겠습니다.

 

마농님께 항상 많은것을 배웁니다

감사합니다.

량디(fidele)님이 2014-07-09 13:15에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
40523간단한 쿼리 질문 [1]
버기
2014-07-11
7400
40522쿼리 머지 기능이긴 한데... 간단히 처리 가능한지 [2]
쩌그노트
2014-07-11
7382
40521쿼리 질문 [1]
guest
2014-07-10
7217
40520코드 검증관련 쿼리문의 [8]
량디
2014-07-08
7529
40519rownum과 order by를 동시에 썼을 때 성능..
corny5
2014-07-08
6982
40518[질문] 마지막 노드의 값을 가져오고 싶습니다. [1]
차상환
2014-07-07
7248
40517쿼리 문의 [1]
gome
2014-07-03
6659
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.035초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다