반응형

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


 

반응형
 

코딩테스트 연습

기초부터 차근차근, 직접 코드를 작성해 보세요.

programmers.co.kr

 

기본 SELECT 문 연습 이후 점점 어려워지는 쿼리문제...

우측 상단에서 mysql과 oracle로 선택 가능

문제풀기 전

mysql로 문제풀었을 경우 앞에만 파란색 체크표시, oracle sql로 문제풀었을 경우 우측만 파란체크표시

둘다 풀었을 경우 아래와 같이 표시

 

1. SELECT 완료

- 상위 n개 레코드 (문법 다름)

--mysql 1건 조회 
SELECT NAME FROM ANIMAL_INS 
ORDER BY DATETIME ASC 
LIMIT 1 

--오라클 1건 조회 
SELECT * FROM 
( SELECT NAME FROM ANIMAL_INS 
ORDER BY DATETIME ASC ) 
WHERE ROWNUM =1
 

2. SUM, MAX, MIN 완료

3. GROUP BY 완료

- 동명 동물 수 찾기

* HAVING 절

- WHERE 절에서는 집계함수를 사용 할 수 없다.

- HAVING 절은 집계함수를 가지고 조건비교를 할 때 사용한다.

- HAVING절은 GROUP BY절과 함께 사용이 된다.

SELECT NAME, COUNT(NAME) 
FROM ANIMAL_INS 
WHERE NAME IS NOT NULL 
GROUP BY NAME 
HAVING COUNT(NAME) >= 2 
ORDER BY NAME ASC

- 입양 시각 구하기_1 (문법 다름)

--mysql 
SELECT HOUR(DATETIME) , COUNT(DATETIME) 
FROM ANIMAL_OUTS 
WHERE HOUR(DATETIME) between '9' AND '20' 
GROUP BY HOUR(DATETIME) 
ORDER BY HOUR(DATETIME) ASC 

--오라클 SELECT TO_CHAR(DATETIME,'HH24') , COUNT(DATETIME) 
FROM ANIMAL_OUTS 
WHERE TO_CHAR(DATETIME,'HH24') between '09' AND '20' 
GROUP BY TO_CHAR(DATETIME,'HH24') 
ORDER BY TO_CHAR(DATETIME,'HH24') ASC
 

- 입양 시각 구하기_2

...level4인만큼 정말 어려워서 공부하면서 풀었다는...눙물...

* [mysql] SET

- 쿼리에서 변수설정 하려면 SET 명령을 사용하며 변수 앞에는 @를 붙임

-- 변수 초기화 
SET @HOUR :=-1; 
SELECT (@HOUR := @HOUR+1) AS HOUR , 
	( SELECT COUNT(*) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @HOUR ) AS COUNT 
FROM ANIMAL_OUTS WHERE @HOUR <23

 

* [ORACLE] CONNECT BY LEVEL

- 계층형 질의 구문

- CONNECT BY LEVEL 은 연속된 숫자를 조회할 때 사용하며 오라클에서만 지원

- 1~ 10까지 연속된 숫자 조회

ex ) SELECT LEVEL AS NO FROM DUAL

CONNECT BY LEVEL <= 10

-- LEFT OUTER JOIN으로 A테이블 기준 조회하며, B.CNT가 NULL인 경우 0으로 출력 
SELECT A.NUM, NVL(B.CNT,0) 
FROM ( 
	--1~23 조회 
    SELECT LEVEL-1 AS NUM FROM DUAL CONNECT BY LEVEL <=24 
    ) A 
    LEFT OUTER JOIN 
    ( 
    --각 시간대별 입양건수 조회 
    SELECT TO_CHAR(DATETIME, 'HH24') AS HOUR, COUNT(*) AS CNT 
    FROM ANIMAL_OUTS 
    GROUP BY TO_CHAR(DATETIME, 'HH24') 
    ) B 
 ON A.NUM = B.HOUR 
 ORDER BY A.NUM

+ Recent posts