[SQL] Oracle, DB2 비교! (DB2 관점에서)

SONGB·2023년 7월 13일
0

SQL

목록 보기
6/13

내가 말했던가
나는 업무에서 DB2를 사용해 데이터베이스를 관리한다고

우선 이 글은 Oracle은 만져봤지만 DB2는 만져본지 약 한 달정도만(사실 기간의 반 이상은 만지지도 않고 쿼리문을 감상하긴 했지만)된 상태에서 작성하는 글이다.

아직까지는 Oracle과 크게 다른 점을 느끼지 못해 알아보고자 이 글을 작성한다!
뭣도 모르지만 글을 써보겠다는 아주 근자감 마인드다 키키


Oracle과 비슷한 점!

_1.함수가 상당히 비슷하다.(특히 숫자 함수)

2.쿼리문 LIKE 작성 방법이 MySql보다는 Oracle에 더 유사하다.(주관이 아주 많이 섞여있는 나의 퓔~링-)

SELECT *
FROM TABLE
WHERE ID_NM LIKE '%'||'NAME'||'%'

이렇게 사용된다. Mysql처럼 '%'+'NAME'+'%' 절대 안된다.


Oracle과 차이점

DATA TYPE

OracleDB2
CHAR(n)CHAR(n)
VARCHAR(n)LONG VARCHAR(n)
LONGVARCHAR(n)
NUMBERSMALLINT
-INTEGER
-BIGINT
-DECIMAL
-DOUBLE
-FLOAT
BLOBBLOB(n)
CLOBCLOB(n)
DATEDATE
-TIME
-TIMESTAMP

BLOB : Binary data 저장하는 타입
CLOB : 큰 데이터 저장하는 타입 (가변 길이 문자열)


쿼리문 작성


내가 DB2를 쓰며 가장 헷갈린다고 생각한 것은 숫자와 문자 사이에 자동으로 CASTING이 되지 않는다는 거였다.
그래서 문자와 숫자를 비교하거나 조인하려면 무조건 적으로 CAST, INT, CHAR를 기재해주어야 한다.


또한 현재 날짜 / 시간을 구하기 위해서는
Oracle에선 SYSDATE 사용하는 반면,
DB2에서는 CURRENT DATE, CURRENT TIMESTAMP를 사용한다.


NULL 차이

-- ORACLE
SELECT NVL(COL1,0) 
FROM TABLE;

위의 함수는 ORACLE에서 COL이 NULL일 때 0으로 처리해주는 쿼리문이다.

DB2로 바꿔주면

-- DB2
SELECT COALESCE(COL1,0) 
FROM TABLE;

물론 ORACLE에서 COALESCE를 제공하지 않는 것은 아니다
하지만 null을 처리해주는 함수가 있기에 굳!이! 사용하지 않는 것이다.

수정 (2023-07-27)

분명 수많은 블로그에서 Oracle의 NVL 기능을 DB2에서 사용하기 위해선 COALESCE를 사용한다고 했다.
그리고 IBM 공식문서에서도 NVL을 발견한 적이 없다.
당연하게 NVL을 사용하지 못 한다고 여겼는데....
나는 DB2를 사용하는데...
왜 쿼리문에 NVL이 있지????

관련 내용을 찾아보고 싶었으나 찾지 못했고 쿼리문을 직접 입력해서 데이터를 뽑아보았는데 됨....

SELECT NVL(CARD_NUM,'')
FROM CARD_TABLE;

SELECT COALESCE(CARD_NUM,'')
FROM CARD_TABLE;

위에 두 쿼리는 똑같은 결과를 내보낸다.
세상에 믿을 것 하나 없다.......


그리고 DECODE문을 사용할 수 없다.

-- ORACLE
UPDATE TABLE
SET COL1=COL2+DECODE(COL3,'',0,100);

위 코드는 COL3이 ''일 경우 COL2 0을 더해주고 아니면 100을 더해준 값을 COL1에 UPDATE를 해주는 쿼리문이다.

DB2로 바꿔주면

-- DB2
UPDATE TABLE
SET COL1=COL2+
	CASE COL3
	WHEN '' THEN 0
	ELSE 100
	END
;

이거 또한 물론 ORACLE에서 똑같이 구현할 수 있다.(CASE, WHEN, THEN, ELSE, END)
하지만 얘도 굳이 이렇게 할 필요가 있을까?

하지만 CASE WHEN문은 꽤나 중요하다고 생각한다. 나는!
다음에 한 번 정리를 해봐야겠다!

profile
⚽⚾데굴데굴 굴러가는 내 맘대로 벨로그🏀🏐

0개의 댓글