반응형

DB2쿼리를 오라클 쿼리로 변환하는 프로젝트 진행하면서 발견한 문법차이 정리내용 :)

 

1. NULL 처리

(DB2)NULL값 치환 COALESCE 
COALESCE(DEPTNO,'1')      
(ORACLE)NULL값 치환 NVL
NVL(DEPTNO, '1')                  
(DB2) 검색조건 에서 사용시 columnA =''
(ORACLE) ORACLE에서는 ''(빈공백)을 NULL값으로 인식하므로 =''가 아닌 IS NULL로 조회해야 검색가능
검색조건 columnA IS NULL 

2. 날짜 함수

 날짜계산 1

(DB2) DATE컬럼 + 1 MONTHS
BASEMONTH = TO_CHAR(TO_DATE(REPLACE('202011', '-', ''), 'YYYYMM') - 1 MONTHS, 'YYYYMM')
(ORACLE) ADD_MONTHS
BASEMONTH = ADD_MONTHS(REPLACE('202011', '-', ''), 'YYYYMM') - 1 

날짜계산2 (날짜를 쉽게 계산할 수 있지만 윤달계산에 이슈있음....!!! )

(DB2) 
DATE + 10 Minutes >= CURRENT_TIMESTAMP  --분 더하기
SYSDATE - 2 year MINUS_YEAR  -- 년 빼기
(ORACLE) interval
DATE + (interval '10' minute) >= CURRENT_TIMESTAMP --분 더하기
SYSDATE - (INTERVAL '2' YEAR) MINUS_YEAR -- 년 빼기

 날짜 'yyyymmddhh24miss' 포맷 변경 출력

(DB2) SUBSTR( HEX( 컬럼명 ), 1, 14 ) 
SUBSTR(HEX(CURRENT TIMESTAMP), 1, 14) 
(ORACLE)  
TO_CHAR(CURRENT_TIMESTAMP, 'yyyymmddhh24miss') 

 일 더하기/빼기

(DB2) TO_CHAR(CURRENT TIMESTAMP - 5 DAYS, 'YYYY-MM-DD')
(ORACLE) TO_CHAR(CURRENT_TIMESTAMP - 5, 'YYYY-MM-DD')

 현재 시각 가져오기 & dummy테이블

(DB2)CURRENT DATE, CURRENT TIMESTAMP
SELECT CURRENT DATE (or CURRENT TIMESTAMP) FROM SYSIBM.SYSDUMMY1
(ORACLE) CURRENT_DATE(SYSDATE) ,CURRENT_TIMESTAMP 
SELECT CURRENT_DATE(SYSDATE) (or CURRENT_TIMESTAMP) FROM DUAL

 

3. 문자함수

 문자열 내에서 지정 문자 위치구하기

(DB2) LOCATE(찾을문자, 문자열)
CASE WHEN LOCATE('MS',PAXNAME) != 0 THEN SUBSTR(PAXNAME,1,LOCATE('MS',PAXNAME)-1)
(ORACLE)INSTR('비교할 대상', '비교하고자하는 값')
CASE WHEN INSTR('MS',PAXNAME) != 0 THEN SUBSTR(PAXNAME,1,INSTR('MS',PAXNAME)-1)

 오른쪽부터 자리수까지 추출

(DB2) RIGHT(변수명, 자리수)
(ORACLE) SUBSTR(변수명, -자리수)

 

4. 변환함수

(DB2) CHAR() , VARCHAR_FORMAT()
CHAR(DATE(컬럼명))
VARCHAR_FORMAT(current timestamp, 'YYYYMMDDHH24MISS')
(ORACLE)TO_CHAR()
TO_CHAR(컬럼명, 'yyyy-mm-dd hh24miss')
TO_CHAR(current_timestamp, 'YYYYMMDDHH24MISS') 
(DB2) DATE()
(ORACLE) TO_DATE()
(DB2) CASE WEN ...THEN...ELSE
(ORACLE) DECODE()

6. NEXTVAL 

(DB2) 
SELECT  LPAD(SQNORTRADE02.NEXTVAL,8,0)
(ORACLE) 
SELECT  LPAD(NEXTVAL FOR SQNORTRADE02,8,0)

7. 인덱스 조회

(DB2)
 select *
from syscat.INDEXES
where TABNAME = '테이블명'
order by INDNAME
with UR
(ORACLE)
SELECT A.TABLE_NAME
     , A.INDEX_NAME
     , A.COLUMN_NAME
  FROM ALL_IND_COLUMNS A
 WHERE A.TABLE_NAME = '테이블명'
 ORDER BY A.INDEX_NAME, A.COLUMN_POSITION


 

+ Recent posts