문자열 자르기 조언 부탁드립니다. 0 6 2,272

by 반테러 [2009.03.09 10:56:09]


 

어떻게 짜야 되는지 고민하다,

T-SQL 프로그래밍으로는 짜봤는데

ORACLE SQL로 어떻게 짜야할지, 생각해보다, 조언 부탁드립니다.

1234+3232-1222-3211

이런식으로 컬럼이 존재 할경우

COL1  COL2

+           1234

+           3232

-            1222

-            3211

요런식으로 나와야 하는데, SQL은 잘 모르겠네요...

조언 부탁드립니다..

by 피터 [2009.03.09 12:39:17]
SELECT decode(substr('1234+3232-1222-3211', (rownum-1)*4+(rownum-1), 1),'+','+','-','-','+') signL
, substr('1234+3232-1222-3211', (rownum-1)*4+rownum, 4) numberL
FROM DUAL
connect by level<=10;

by 마농 [2009.03.09 14:04:47]
SELECT lv
, SUBSTR('+'||col,INSTR(col_,'+',1,lv),1) col1
, SUBSTR(col,INSTR(col_,'+',1,lv),INSTR(col_,'+',1,lv+1)-INSTR(col_,'+',1,lv)-1) col2
FROM
(
SELECT lv, col
, '+'||TRANSLATE(col,'+-*/'||col,'++++'||col)||'+' col_
FROM (SELECT '1234+3232-1222-3211' col FROM dual)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 4)
)
;

by 마농 [2009.03.09 14:05:18]
SELECT grp
, MIN(col_) col_1
, SUBSTR(XMLAGG(XMLELEMENT(x,col_) ORDER BY lv).EXTRACT('//text()').getStringVal(),2) col_2
FROM
(
SELECT lv, col
, SUBSTR('+'||col,lv,1) col_
, SUM(SIGN(48 - LEAST(ASCII(SUBSTR('+'||col,lv,1)), 48))) OVER(ORDER BY lv) grp
FROM (SELECT '1234+3232-1222-3211' col FROM dual)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL < 30)
WHERE lv <= LENGTH(col) + 1
)
GROUP BY grp
;

by 반테러 [2009.03.09 15:37:21]
와우, 마농님은 역시 대단하신데요, 이해를 못하겟어영 ㅋㅋㅋ
문제를 좀 수정해서

+1234567899-1234567789+1222233333.... <COL1>

이렇게 기호 + 10자리로 되어있는것을 잘라 넣는건데요.
저는 피터님꺼보고 응용해서

SELECT NVL(SUBSTR(COL1, (ROWNUM*11+1), 1), '+') SGN,
SUBSTR(NVL(SUBSTR(COL1, (ROWNUM*10+2+ROWNUM-23), 11), COL1),2, 10) CAL_ACC,
COL1
FROM TABLE
CONNECT BY LEVEL <= LENGTH(COL1)/11;


요런식으로 했더니,
처음 잘리는거 빼고는 잘 나오는 듯 하네요.

커넥티드 배웠네요.

감사합니다. ^^

by 마농 [2009.03.09 15:44:50]
자리수 고정이라면 피터님 답글 참조하세요.
제 답은 가변 자리수용입니다.

by 마농 [2009.03.09 16:05:50]
SELECT SUBSTR(col, (lv - 1) * 11 + 1, 1) col1
, SUBSTR(col, (lv - 1) * 11 + 2, 10) col2
FROM (SELECT '+1234567899-1234567789+1222233333' col FROM dual)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 10)
WHERE lv <= LENGTH(col)/11
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입