ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Oracle to Mysql 마이그레이션 문법
    DB 2023. 2. 3. 11:20

    Oracle to Mysql (MariaDB) 쿼리변환 작업

    Oracle 쿼리를 Mysql 쿼리로 변환하는 프로젝트에 참여했었다. 작업했던 내용들을 기억하기 위해 작성하는 쿼리 전환 작업 문법 정리

    1. NVL() -> IFNULL()

    IFNULL( expression1, expression2 ) : expression1이 NULL이 아니면 expression1을, NULL이면 expression2를 반환

    • ORACLE
    SELECT NVL(USER_ID, ‘’) FROM TABLE
    • MYSQL
    SELECT IFNULL(USER_ID, ‘’) FROM TABLE

     

    2. NVL2() -> CASE WHEN ~ THEN ~ END

    • ORACLE
    NVL2(문자열,’ ‘)
    • MYSQL
    CASE WHEN 문자열 IS NULL THEN ‘Y’ ELSE ‘N’ END
    CASE WHEN 문자열 IS NOT NULL THEN ‘N’ ELSE ‘Y’ END

     

    3. SYSDATE -> SYSDATE(), NOW()

    현재 날짜, 시간 확인

    • ORACLE
    SELECT SYSDATE FROM DUAL
    • MYSQL 
    SELECT NOW() FROM DUAL

     

    4. TO_CHAR() -> DATE_FORMAT()

    날짜 포멧 변환

    • ORACLE
    SELECT TO_CHAR(REG_DATE, ‘YYYYMMDD HH24MISS’) FROM DUAL
    • MYSQL
    SELECT DATE_FORMAT(REG_DATE,’%Y%m%d%H%i%s’) FROM DUAL

     

    5.  요일 변경

    요일변환의 숫자범위

    • ORACLE
    일~토 : 1~7 (결과값: 오늘이 수요일인 경우 4를 반환)
    • MYSQL
    일~토 : 0~6 (결과값: 오늘이 수요일인 경우 3을 반환)

     

    6.  || -> CONCAT()

    문자와 문자 합치는 방법

    • ORACLE
    SELECT USER_ID FORM TABLE WHERE USER_ID LIKE ‘%’ || ‘JIEUN’ || ’%’
    • MYSQL
    SELECT USER_ID FROM TABLE WHERE USER_ID LIKE CONCAT(‘%’,’JIEUN’,’%’)

     

    7.  TO_CHAR, TO_NUMBER -> CAST

    형변환 방법

    숫자에서 문자

    • ORACLE
     SELECT TO_CHAR(123) FROM DUAL
    • MYSQL
    SELECT CAST(123 AS CHAR) FROM DUAL

    문자에서 숫자

    • ORACLE 
    SELECT TO_NUMBER(‘123’) FROM DUAL
    • MYSQL
    SELECT CAST(‘123’ AS INTEGER) FROM DUAL

     

    8.  ROWNUM -> LIMIT

    rownum이 조건으로 사용될 경우 limit 사용

    • ORACLE - ROWNUM>=5
    • MYSQL - LIMIT 5

    rownum이 컬럼으로 사용될 경우 (MariaDB)

    • ORACLE - ROWNUM()
    • MYSQL - ROW_NUMBER() OVER()

     

    9. TRUN() -> DATE()

    날짜 데이터 시,분,초 제외 한 년,월,일만 출력

    • ORACLE 
    TRUN(SYSDATE)
    • MYSQL 
    TRUNCATE(NOW(),1) ( MariaDB는 DATE(SYSDATE()) )

     

    10. 시퀀스.NEXTVAL -> NEXTVAL(‘시퀀스’)

    시퀀스의 다음 값 출력

    • ORACLE
    SELECT SEQ.NEXTVAL FROM DUAL
    • MYSQL
    SELECT NEXTVAL(‘SEQ’) FROM DUAL (MARIADB는 ‘’ 제거하고 사용)

     

    11. TO_DATE() -> STR_TO_DATE()

    • ORACLE
    TO_DATE(‘18/05/2021 00:00:00’, ‘MM/DD/YYYY HH24:MI:SS’)
    • MYSQL
    STR_TO_DATE(‘18/05/2021 00:00:00’, ‘%m/%d/%Y %H:%i:%s’)

     

    12. Subquery alias

    서브쿼리에 alias가 없다면 붙여준다

    • ORACLE
    SELECT A, B FROM (SELECT A, B FROM TABLE)
    • MYSQL
    SELECT T.A, T.B FROM (SELECT A, B FROM TABLE) T

     

    13. DELETE -> DELETE FROM

    ORACLE에서는 FROM을 생략 가능하지만, MYSQL에서는 필수

    • ORACLE
    DELETE TABLE WHERE ~
    • MYSQL
    DELETE FROM TABLE WHERE ~

     

    14. DECODE문 -> CASE문

    문자열을 비교대상과 비교하여 참일 때와 거짓일 때의 값을 표시

    • ORACLE - DECODE(문자열,비교대상,참일때 값, 거짓일때 값)
    • MYSQL - CASE WHEN 문자열=비교대상 THEN 참일때 값 ELSE 거짓일때 값 END

     

    15. SUBSTR() 0 -> 1

    시작이 0일 경우 1로 변환

    • ORACLE - SUBSTR(문자열,0,3)
    • MYSQL - SUBSTR(문자열,1,3)

     

    16. 암호화, 복호화

    암호화

    • ORACLE - DAMO.ENCRYPT_VAR(‘AES128_FULL’,’평문 값’,’’)
    • MYSQL - DAMO.ENC_B64(‘AES256_FULL’,’평문 값)

    복호화

    • ORACLE - DAMO.DECRYPT_VAR(‘AES128_FULL’,’암호화 값’,’’)
    • MYSQL - DAMO.DEC_B64(‘AES256_FULL’,’암호화 값’)

     

    17. LISTAGG() -> GRUP_CONCAT()

    컬럼의 ROW 데이터를 한줄로 나열한 뒤 구분자로 구분하여 표시

    • ORACLE
    LISTAGG(나열할 컬럼,’구분자’) WITHIN GROUP(ORDER BY 컬럼)
    • MYSQL
    GROUPB_CONCAT(나열할 컬럼 ORDER BY 컬럼 SEPARATOR ‘구분자’)

     

    18. OUTER JOIN 변경

    LEFT OUTER JOIN

    • ORACLE 
     SELECT * FROM T1,T2 WHERE T1.I1=T2.I2(+)
    • MYSQL
    SELECT * FROM T1 LEFT OUTER JOIN T2 ON T1.I1=T2.I2

    RIGHT OUTER JOIN

    • ORACLE
    SELECT * FROM T1,T2 WHERE T1.I1(+)=T2.I2
    • MYSQL
    SELECT * FROM T1 RIGHT OUTER JOIN T2 ON T1.I1=T2.I2

     

    19. START WITH CONNECT BY -> RECURSIVE

    계층형 함수로 만들기 위해 WITH RECURSIVE를 사용하여 테이블 생성

     

    20. MERGE INTO -> INSERT, UPDATE

    조건이 맞는지 (MATCHED)에 대한 SELECT 문을 실행시켜서 결과값이 있으면 UPDATE문 실행, 결과값이 없으면 INSERT문 실행

    • ORACLE
    MERGE INTO TABLE USING DUAL ON (MATCHED 조건) 
    THEN 조건이 참일때 수행할 쿼리(INSERT OR UPDATE) 
    WHEN NOT MATCHED THEN 조건이 거짓일때 수행할 쿼리 (INSERT OR UPDATE)

    • MYSQL 
    INSERT문 ON DUPLICATE KEY UPDATE (UPDATE 할 항목들)

     

    MYSQL에서는 INSERT INTO 구문을 수행한 뒤 KEY 값이 중복된 경우 UPDATE문이 실행된다. 
    PK 값이 중복되어야만 UPDATE문이 실행되므로 INSERT가 2번 되면 PK가 정상적으로 등록이 되었는지 확인하여야 한다.

    'DB' 카테고리의 다른 글

    캐시(Cache)와 Redis  (0) 2023.05.08
Designed by Tistory.