split 관련해서 문의드립니다. 0 12 3,262

by 오완호 split [2013.11.08 16:22:29]


oracle문의.png (39,711Bytes)

안녕하세요. 

컬럼의 데이터를 split 처리해서 업데이트 하려고 합니다.

게시판에서 split 관련해서 이리저리 찾아보니 REGEXP_SUBSTR을 이용해서 

처리하고 있는데 한번이 아니라 두번 split를 처리하려고 합니다. 

특정문자가 게시판에 입력이 안되서 이미지로 첨부합니다. 



by 우리집아찌 [2013.11.08 16:28:06]

숫자로된 7자리 데이터만 찾는건가요??

by 오완호 [2013.11.08 16:29:28]
네 숫자형태의 7자리를 찾습니다. 

by 우리집아찌 [2013.11.08 16:57:49]
 
-- @은 특수문자로 대체해주세요.. 못만들겠어요.. 샘플데이타가 더힘듬..
WITH T AS (
SELECT 1 FLD_KEY ,'123456A`234@5678@0530020' ACL_KEY_CODE FROM DUAL UNION ALL
SELECT 2,'1234562`2345678@0530021`0530022' FROM DUAL UNION ALL
SELECT 3,'1234563`23456@78`l' FROM DUAL UNION ALL
SELECT 4,'1234564`234@5678`c' FROM DUAL UNION ALL
SELECT 5,'1234565`23456@78`7' FROM DUAL 
)
SELECT * FROM 
 (SELECT FLD_KEY , REGEXP_SUBSTR(TXT,'[^`]+',1,LV) STR , lv FROM
   (SELECT FLD_KEY , REPLACE(ACL_KEY_CODE,chr(13)||chr(10),'`') txt FROM T )a , 
   (SELECT LEVEL lv FROM DUAL CONNECT BY LEVEL <= 10 ) b
 WHERE lv <= LENGTH(TXT) - LENGTH(REPLACE(TXT,'`',''))+1 )
WHERE LENGTH(STR) = 7 
 AND REGEXP_LIKE(STR,'^[[:digit:]]*$')
 ORDER BY FLD_KEY , lv
 

by 오완호 [2013.11.08 17:34:32]

쿼리문중에서 

(SELECT LEVEL lv FROM DUAL CONNECT BY LEVEL <= 10 ) b

이부분이 어떤 역확을 하고 있나요?

LEVEL <= 10 부분에 걸려서 그런지 데이터가 몇건 안나오는데 

LEVEL <= 20으로 바꿔서 해보니깐 출력되는 LV에 16까지 찍히네요.

LEVEL 값을 높게 잡아도 상관 없나요? 

by 우리집아찌 [2013.11.08 17:42:14]
캐리지리턴은 복사 안되네요..
 <pre class="brush:sql;">
@ = > chr(13)||chr(10)로 대체해주세요

(SELECT FLD_KEY , REPLACE(ACL_KEY_CODE,chr(13)||chr(10),'`') txt FROM T )a ,
</pre>

by 우리집아찌 [2013.11.08 17:47:54]
LEVEL 값 높게해도 상관없습니다.

by 마농 [2013.11.08 17:16:42]
결과는 어떻게 표현되길 원하시나요?
검색 갯수만큼 아래로 나열?
아님 옆으로 컴마를 붙여서 나열?

by 오완호 [2013.11.08 17:24:39]
검색갯수만큼 아래로 나열되면 됩니다.

by 마농 [2013.11.08 17:36:58]
-- 숫자 8자리는 없다고 가정하면 간단하게...
SELECT fld_key
     , lv
     , REGEXP_SUBSTR(acl_key_code, '[0-9]{7}', 1, lv) v
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
 WHERE lv <= REGEXP_COUNT(acl_key_code, '[0-9]{7}')
 ORDER BY fld_key, lv
;

by 우리집아찌 [2013.11.08 17:43:57]
역시 정규식을 잘써야...ㅜㅜ

by 오완호 [2013.11.08 17:55:20]
현재 oracle 버전이 10g 라서 REGEXP_COUNT 를 사용할 수 없습니다. 

by 마농 [2013.11.08 18:04:01]
SELECT fld_key
     , lv
     , REGEXP_SUBSTR(acl_key_code, '[0-9]{7}', 1, lv) v
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
-- WHERE lv <= REGEXP_COUNT(acl_key_code, '[0-9]{7}')
 WHERE lv <= LENGTH(REGEXP_REPLACE(acl_key_code, '([0-9]{7})|.', '\1')) / 7
 ORDER BY fld_key, lv
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입