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() 버튼을 클릭하여 작성 하시면 됩니다.