반응형
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 |
'SQL' 카테고리의 다른 글
[SQLD] 기출문제 1- 1장 데이터 모델링의 이해 (0) | 2022.03.09 |
---|---|
[SQLD] 요점정리 1- 1장 데이터 모델링의 이해 (0) | 2022.03.08 |
[고급 SQL 문제풀이] HackerRank 문제 및 풀이(1) (0) | 2022.02.04 |
[중급 SQL 문제풀이] HackerRank 문제 및 풀이(3) (0) | 2022.01.19 |
[중급 SQL 문제풀이] HackerRank 문제 및 풀이(2) (0) | 2022.01.17 |