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 37867 게시물 읽기
No. 37867
도움을 요청해요.. (ㅜㅡ)
작성자
이상영(lsrara)
작성일
2010-08-17 18:22
조회수
3,225

데이터가 

REF_NO             CUN_CODE   ...
---------------------------------------------------------------
U200810-002CU      해외          ...
U200810-001CN      국내          ...
.
.
GP2008-0001EP     국내           ...
GS2008-0001EP     국내           ...
GP2009-0001EP     국내           ...
.
PC2009-0036          해외           ...
.
.
PD2010-0001          국내           ...

위와 같이 REF_NO 가 정해진 형식없이 존재하는 상태입니다..

컬럼 REF_NO를 기준으로
함수를 이용해서... 년도(2008 ~~ 2010) 4자리만 뽑아내서 사용하고자 하는데요.. 

(2009까지)와 (2010이후) 로 분리하여
2009까지를 10 의 값으로 하고 싶습니다.       <1차 (공통코드 10) 이기 때문에> 
2010이후를 20 의 값으로 하면 됩니다. 역시  < 2차 (공통코드 20) 이기 때문에>
 

어찌 하면 좋을 까요... ><;;

현재 오라클 9i 버전이기때문에.. REGEXP_SUBSTR 함수는 사용할 수 없다고 하네요... 

고수님들 도와 주세요  (ㅜㅡ)

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

WITH t AS
(
SELECT 'U200810-002CU' ref_no, '해외' cun_code FROM dual
UNION ALL SELECT 'U200810-001CN', '국내' FROM dual
UNION ALL SELECT 'GP2008-0001EP', '국내' FROM dual
UNION ALL SELECT 'GS2008-0001EP', '국내' FROM dual
UNION ALL SELECT 'GP2009-0001EP', '국내' FROM dual
UNION ALL SELECT 'PC2009-0036'  , '해외' FROM dual
UNION ALL SELECT 'PD2010-0001'  , '국내' FROM dual
)
SELECT ref_no, cun_code
     , CASE WHEN SUBSTR(
                 TRANSLATE(ref_no, '0123456789'||ref_no, '0123456789')
                 , 1, 4) >= '2010'
            THEN '20' ELSE '10' END gubun
  FROM t
;

마농(manon94)님이 2010-08-17 18:45에 작성한 댓글입니다.

도움 주셔서 정말 감사합니다...

그런데...  또 다른 문제가 생겻어요...   ><;;;

WITH  t   AS (    .....   )   이 부분을 기존에 정의된 쿼리에서 활용하려고 합니다...

기존작성된 쿼리

        SELECT M1.REF_ID GRP_ID
             , M1.REF_ID
             , M1.REF_NO
             , M1.RIGHT_DIV
             , M1.INOUT_DIV
             , 'APP' REWARD_DIV
             , M2.INV_GRADE REWARD_GRADE
             , I.INV_USER
             , FN_USER_NAME(I.INV_USER) EMP_NAME
             , I.QUOTA_RATIO
             , I.REWARD_GIVETARGET_YN
        FROM   TB_APP_MST M1
             , TB_APP_MST_INT M2
             , TB_MAPP_INVENTOR I
        WHERE  M1.REF_ID = M2.REF_ID
        AND    M1.REF_ID = I.REF_ID
        AND    M2.APP_REWARD_GIVETARGET_YN = '1'
        AND    M1.DIVISION_CODE IS NULL
        AND    M1.APP_NO IS NOT NULL
        AND    M1.APP_DATE IS NOT NULL

도움 주신 부분을 사용하여 바꿔본 쿼리

SELECT M1.REF_ID GRP_ID
     , M1.REF_ID
     , M1.REF_NO
     , (
        SELECT CASE WHEN SUBSTR(
                         TRANSLATE(M1.REF_NO, '0123456789'||M1.REF_NO, '0123456789')
                         , 1, 4) >= '2010'
                    THEN '20' ELSE '10' END REF_GUBUN
        FROM TB_APP_MST M1
       ) REF_GUBUN
     , M1.RIGHT_DIV
     , M1.INOUT_DIV
     , 'APP' REWARD_DIV
     , M2.INV_GRADE REWARD_GRADE
     , I.INV_USER
     , FN_USER_NAME(I.INV_USER) EMP_NAME
     , I.QUOTA_RATIO
     , I.REWARD_GIVETARGET_YN
FROM   TB_APP_MST M1
     , TB_APP_MST_INT M2
     , TB_MAPP_INVENTOR I
WHERE  M1.REF_ID = M2.REF_ID
AND    M1.REF_ID = I.REF_ID
AND    M2.APP_REWARD_GIVETARGET_YN = '1'
AND    M1.DIVISION_CODE IS NULL
AND    M1.APP_NO IS NOT NULL
AND    M1.APP_DATE IS NOT NULL

그런데...  이렇게 될 경우

단일 행 부속 질의에 2개 이상의 행이 리턴되었습니다    라는 오류가 뜨는데요...

그래서

     , (
        SELECT CASE WHEN SUBSTR(
                         TRANSLATE(M1.REF_NO, '0123456789'||M1.REF_NO, '0123456789')
                         , 1, 4) >= '2010'
                    THEN '20' ELSE '10' END REF_GUBUN
        FROM TB_APP_MST M1
       ) REF_GUBUN
이 부분을 오라클 사용자 정의 함수로 만들어서 사용 하고자 합니다....

     , FN_REF_GUBUN(M1.REF_NO) REF_GUBUN   요런 식으로  했으면 하는데요

어찌 하면 될까요????

이상영님이 2010-08-18 11:36에 작성한 댓글입니다. Edit

TB_APP_MST 테이블이 이미 메인쿼리에서 사용되고 있는데
그걸 다시 스칼라서브쿼리로 사용하시면 안되죠.
select, from 다 빼시고 그냥 사용된 계산식만 select절에 사용하시면 됩니다.


SELECT M1.REF_ID GRP_ID
     , M1.REF_ID
     , M1.REF_NO
     , CASE WHEN SUBSTR(
                 TRANSLATE(M1.REF_NO,'0123456789'||M1.REF_NO,'0123456789')
                 , 1, 4) >= '2010'
            THEN '20' ELSE '10' END REF_GUBUN
     , ...

마농(manon94)님이 2010-08-18 12:45에 작성한 댓글입니다.
이 댓글은 2010-08-18 12:46에 마지막으로 수정되었습니다.

답변 정말 감사드립니다...   제가 아직 초짜라 ..  많이 버벅되게 되네요...  (^^);;

도움 주셔서 감사해요 ~~~'''''

 

아참 !!..    그런데 

CASE WHEN SUBSTR(
                 TRANSLATE(M1.REF_NO,'0123456789'||M1.REF_NO,'0123456789')
                 , 1, 4) >= '2010'
            THEN '20' ELSE '10' END REF_GUBUN

이 부분을 ..  FN_REF_GUBUN(M1.REF_NO) REF_GUBUN   이런 형태의

사용자 지정함수로는 사용할 수 없을까요??

함수 명을 FN_REF_GUBUN 이렇게 만들어서요... 

이상영님이 2010-08-18 13:22에 작성한 댓글입니다. Edit

그닥, 길지도 않은 계산식을 굳이 함수로 만들 필요가 있을런지?...


CREATE OR REPLACE FUNCTION fn_ref_gubun(vRef_no VARCHAR2)
RETURN VARCHAR2
IS
vRef_gubun VARCHAR2(2);
BEGIN
    SELECT CASE WHEN SUBSTR(
                     TRANSLATE(vRef_no,'0123456789'||vRef_no,'0123456789')
                     , 1, 4) >= '2010'
                THEN '20' ELSE '10' END
      INTO vRef_gubun
      FROM dual
    ;
    RETURN vRef_gubun;
END;
/

마농(manon94)님이 2010-08-18 13:40에 작성한 댓글입니다.

답변  감사합니다... (^^)(__)

좋은 하루 되시길 바랍니다.. ~~~~~

이상영님이 2010-08-18 15:31에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
37870해석좀 부탁드려요.... [4]
이상영
2010-08-18
2899
37869데이터 값 비교 문의 드립니다. [2]
navidc
2010-08-18
2845
37868세로 데이터의 가로 표시 질문드립니다.. [2]
한수진
2010-08-18
3720
37867도움을 요청해요.. (ㅜㅡ) [6]
이상영
2010-08-17
3225
37866계층 구조에서 CONNECT BY PRIOR 조건 추가 가능한가요? [2]
차이
2010-08-17
3783
37865쿼리 random 추출 기능 질문드립니다. [13]
빛을타고
2010-08-17
4491
37864alert log에 Resource Manager 몬가요???
황푸리엔
2010-08-17
2716
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.025초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다