본문 바로가기

프로그래밍/JAVA

오라클 function, decode설명

데이터가 아래와 같습니다.


업체명

계약일자

...

...

(주)고양건설

20000101

...

...

대영테크(주)

20100202

...

...

(합)건축사무소

20090202

...

...

PPC사무소

20090808

...

...

일반설비㈜

20090313

...

...



여기서 제가 하고 싶은건 (주), (합), ㈜ 와 같은 문자 기호등을 제외 시킨 순수한 업체명만을 가지고

다른 데이터와 비교 하고 싶은거죠.


그걸 위해 짠 쿼리는 아래와 같습니다.

decode ( sign(instr(CO_NM,'㈜')),'1', replace(CO_NM,'㈜',''),

decode(instr(CO_NM,'('),'1',substr(CO_NM, instr(CO_NM,'(') + 3,LENGTH(CO_NM))

, '0', CO_NM

, substr(CO_NM, 1, instr(CO_NM,'(')-1)

)

) as CO_NM


하나씩 차근차근 보면

decode( A , B, C, D, E, F ) = A 가 B 이면 C 를 하고 아니면 D이면 E를 하고 아니면 F를 디폴트로 해줘 라는 뜻이죠? ㅎㅎ


쉽게 자바로 본다면

if ( A = B ) { C }

else if ( A = D ) { E }

else F

가 되겠죠


sign(instr(CO_NM,'㈜')),'1', replace('㈜',''),

instr(CO_NM,'㈜') : ㈜의 위치를 알려주죠. 없을 경우는 0

sign() : 양수 일때 1 음수일때 -1 0 일때는 0을 리턴합니다.

즉 sign(instr(CO_NM,'㈜')) 은 특정 문자열이 있냐 없냐를 알수 있습니다.


replace (a,b) : a 를 b 로 바꿔줍니다. (trim으로도 할수 있지만 replace가 더 빠르더라구요..)

substr(A,m,n) : A 문자열을 m부터 n 까지 자릅니다.

LENGTH(CO_NM) : 문자열의 길이를 가져옵니다.


그럼 다시 차근히 소스를 보면



decode ( sign(instr(CO_NM,'㈜')),'1', replace(CO_NM,'㈜',''), // CO_NM 에 ㈜가 있으면 ㈜를 없애고

// CO_NM에 ㈜ 가 없으면

// (주),(합)을 없애기 위한 decode 입니다 .

decode(instr(CO_NM,'('),'1',substr(CO_NM, instr(CO_NM,'(') + 3,LENGTH(CO_NM))

// '(' 괄호가 맨 처음에 와있다면 (주), (합) 자른 나머지를 가져오고

, '0', CO_NM

// '(' 괄호가 없으면 그대로 가져오고

, substr(CO_NM, 1, instr(CO_NM,'(')-1)

// 그게 아니라면 처음부터 '(' 괄호 앞까지 잘라와라

) as CO_NM // 컬럼명은 CO_NM


이런거죠...

( 물론 더 간단한 방법은 많습니다.. 제 소스가 정답은 아니에요!! 저도 많이 서툴러서 부끄럽습니다 ㅠ.ㅠ )


+) 간단하게 아래와 같은 방법도 있네요 ㅎㅎ ㅠ.ㅠ;;

TRIM(SUBSTR(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(C.CO_NM,'(주)',''),'㈜',''),'(합)',''),'(유)',''),'(부도)',''),1,4))



그런데 문제는 계약에 따른 데이터이기 때문에

업체명이 계속 들어 올텐데 (부도), (멜랑꼴리),[어쩔시구] 뭐 이런식으로 잘라 내야 한다면

소스를 매번 거기에 맞춰 바꾸긴 힘들다는거죠... ㅠ.ㅠ


그래서 function 을 쓰는 방법으로 바꾸었습니다.

TB_CD001 이라는 테이블에 아래와 같이 데이터를 넣었어요

( 이 테이블은 공통적으로 쓰는 코드를 모아놓는 테이블입니다. )


코드명

내용

...

...

CO_EXCL_SYM

(주)

...

...

CO_EXCL_SYM

(합)

...

...

CO_EXCL_SYM

...

...

CO_EXCL_SYM

[어쩔시구]

...

...



CREATE OR REPLACE FUNCTION SSYADM.fc_pr_get_co_excl_sym(p_co_nm VARCHAR2)

// SSYADM의 권한으로 fc_pr_get_co_excl_sym 의 이름의 함수를 만듦니다. 이 함수는 VARCHAR2 타입의 변수 p_co_nm 을 받네요.


RETURN VARCHAR2 IS v_new_co_nm VARCHAR2(100);

// 나중에 v_new_co_nm VARCHAR2(100) 타입의 변수를 돌려 줄거에요.


BEGIN

// 시작합니다.

v_new_co_nm := p_co_nm;

// 들어온 변수를 새로운 변수에 넣어둡니다.

FOR p IN (SELECT 내용

FROM TB_CD001

WHERE 코드명 = 'CO_EXCL_SYM'

ORDER BY SORT_SRL

)

// 아까 테이블에 넣어놓은 내용들을 가지고 와 변수 p 에 넣어요. 여러개이니 FOR 를 사용합니다.

// 루프를 돌려서

LOOP


BEGIN

SELECT REPLACE(v_new_co_nm, p.내용, '') // v_new_co_nm 에 있는 내용들을 공백으로 바꿔가며 없애고

INTO v_new_co_nm // 바뀐 내용을 다시 v_new_co_nm 에 넣어요.

FROM DUAL;

END;


END LOOP;

// 루프가 끝나면서 바뀐 내용들은 v_new_co_nm 에 들어가있겠죠?

RETURN v_new_co_nm;

// 리턴시켜주고

END;

// 끝냅니다.


컴파일 시켜 준 다음



select fc_pr_get_co_excl_sym(co_nm), co_code from tb_pr001

이렇게 사용하면 됩니다.


오라클 function 은 PL/SQL 문법을 아셔야 해요. 공부하기 좋은 사이트 추천 합니다.

http://www.oracleclub.com/oraclelecture.action?lectureType=PLSQL

대충 한번 쭉 훑어보세요. 안보는것 보다는 대충이라도 보는게 훨신 도움됩니다.

어떤 종류가 있고 목차가 어떻다 정도만 기억해 놓으세요.

어짜피 직접 써볼 기회가 생겨야 디테일 하게 봐질거에요.. ㅎㅎ

 

'프로그래밍 > JAVA' 카테고리의 다른 글

oracle developer로 엑셀데이터 넣기  (0) 2012.12.11
쿼리(query) 에러노트 MySQL  (0) 2012.11.05
에러노트  (0) 2012.10.22
MySQL 원격 접속시키는 방법  (0) 2012.10.17
File.separator (이미지 화면에 뿌려줄때)  (0) 2012.07.30