MSSQL에서 CUBRID 쿼리 변경 시 수정한 부분

2024. 7. 3. 10:57SQL

mssql에서 CUBRID db로 바꾸면서 알게된 것들을 써놓고 싶어서 쓰게되었습니다.

변경하는 방법을 자세하게 알려드리고 싶지만 저도 알아가는 단계여서 신뢰성이 떨어져

확실하게 아는 범위까지만 적용시 오류없이 동일값이 잘 나왔던 것 위주로 작성했습니다.

 

현재 진행중이라서 발견하는대로 수정하겠습니다.

혹시나 틀렸거나 새로운 것이 있다면 알려주시면 너무 감사하겠습니다.

 

Mybatis를 사용하고

큐브리드 버전은 10.2 버전을 썼습니다.

버전별로 지원되는 범위가 다르기 때문에 버전에 유의해주세요

 

<다른 점들>

1.  테이블과 컬럼명이 전부 소문자로 저장된다.

테이블과 컬럼명이 전부 소문자로 저장이 되어

자바스크립트에서 대문자로 해당 컬럼명을 가져오려고 하면 가져올 수가 없습니다

SQLGate에서도 대문자로 설정하는게 따로없어서

UPPER를 사용하거나 java 코드에서 toUpperCase를 통해 대문자로 데이터를 넘기도록

조치를 해야합니다.

 

2. 시퀀스대신 "시리얼"을 사용한다.

자동증가를위해 시리얼을 사용합니다.

<CREATE>

CREATE SERIAL serial_name
START WITH value 		// 증가 시작값(기본값: 오름차순일 때 1 내림차순일 때 -1)
INCREMENT BY value 		// 증가 간격(기본값:1)
MINVALUE min | NOMINVALUE 	// 시리얼 최소값(38자리 이하) | 오름차순: 1, 내림차순: -10^38
MAXVALUE max | NOMAXVALUE	// 시리얼 최대값(38자리 이하)	| 오름차순: 10^37, 내림차순: -1

 

이 외에도

CACHE cached_num | NOCACHE 옵션이 있는데 저는 사용을 안해서 이 포스팅에선 다루지 않겠습니다.

<INSERT>

INSERT INTO table VALUES (serial_name.NEXT_VALUE)
INSERT INTO table VALUES (serial_name.CURRENT_VALUE)

이런식으로 쓰는데 NEXT_VALUE는 값을 증가시킨 후 값을 반환하고

CURRENT_VALUE는 현재값을 반환합니다.

 

3. GETDATE() 대신 다른것을 사용한다.

mssql은 GETDATE()를 사용해서 날짜와 시간( milli-sec)을 가져오는 방식을 썼습니다.

큐브리드에서는 CURRENT_DATETIME()으로 날짜와 시간을 가져와서 사용하면됩니다.

CURRENT_DATETIMECURRENT_DATETIME (), NOW (), SYS_DATETIMESYSDATETIME

 

시간을 초(sec)단위로 가져오려면

CURTIME (), CURRENT_TIMECURRENT_TIME (), SYS_TIME, SYSTIME

 

만약 시간은 빼고 날짜만 필요하다면(DATE타입)

CURDATE (), CURRENT_DATE (), CURRENT_DATESYS_DATESYSDATE

 

TIMESTAMP 타입

CURRENT_TIMESTAMPCURRENT_TIMESTAMP (), SYS_TIMESTAMPSYSTIMESTAMPLOCALTIMELOCALTIME (), LOCALTIMESTAMPLOCALTIMESTAMP ()

 

이정도로 사용하면 되겠습니다.

 

4. CONVERT()함수대신 다른것을 사용해야한다.

 

예를 들어

CONVERT(VARCHAR, CONVERT(DATE, 컬럼명, 112),111) 이런 쿼리문이 있다면

TO_CHAR(TO_DATE(VALID_FROM_DD, 'YYYYMMDD'), 'YYYY/MM/DD')

이런식으로 바꿔줘야 합니다

CONVERT(타입)  > 타입()

이런 느낌인거죠

 

100: MON DD YYYY HH:MIAM (예: Dec 31 2000 11:59PM)
101: MM/DD/YYYY (예: 12/31/2000)
102: YYYY.MM.DD (예: 2000.12.31)
103: DD/MM/YYYY (예: 31/12/2000)
104: DD.MM.YYYY (예: 31.12.2000)
105: DD-MM-YYYY (예: 31-12-2000)
106: DD MMM YYYY (예: 31 Dec 2000)
107: MMM DD, YYYY (예: Dec 31, 2000)
108: HH:MI:SS (예: 23:59:59)
109: MON DD YYYY HH:MI:SS:MMMAM (예: Dec 31 2000 11:59:59:999PM)
110: MM-DD-YYYY (예: 12-31-2000)
111: YYYY/MM/DD (예: 2000/12/31)
112: YYYYMMDD (예: 20001231)
113: DD MON YYYY HH:MI:SS:MMM(24h) (예: 31 Dec 2000 23:59:59:999)
114: YYYYMMDDHH:MI:SS:MMM(24H) (예: 2000123123:59:59:999)
120: YYYY-MM-DD HH:MI:SS (예: 2000-12-31 23:59:59)

 

헷갈리신다면

쉬운 방법으로는 기존부터 쓰던 CAST 함수를 써도 됩니다.

 

 

5. INDEX의 값이 0이아닌 1부터 시작한다.

SUBSTRING사용시에 알게 된 것인데,

SUBSTRING(column, 0, 3)을

SUBSTRING(column, 1, 4)로 바꿔줬습니다.

참고로 0이나 음수를 넣으면 자동으로 1로 인식해서 0으로 둬도 무방합니다.

하지만 뒤의 값은 1을 증가시켜서 바꿔줘야합니다.

 

6.  값이 ''라면 null대신 빈 문자열이 입력된다.

값이 ' '면 null이 들어가야하는데 빈 문자열 그대로 입력되어서 

"empty string not allowed here" 이라는 오류가 발생했습니다.

그래서 NULLIF를 사용하여 해결했습니다.

 

 

-- 간단한 것들 -- 
<ISNULL>

ISNULL은 IFNULL로 바꿔주면 그대로 쓰면됩니다.

 

<LEN>

LEN을 LENGTH로 풀네임을 써 주시면됩니다.

 

<IIF>

큐브리드에서 IIF를 지원하지 않기에

CASE문으로 처리하시면 됩니다.

 

< REPLICATE>

완전히 똑같진 않지만 RPAD를 사용했습니다.