PostgreSQL에서 CASE 구문은 조건에 따라 다양한 결과를 반환하는 데 사용됩니다.
CASE 구문은 DECODE보다 더 유연하며, 더 복잡한 조건과 다중 비교를 지원합니다.
-- PostgreSQL
SELECT
CASE
WHEN score >= 90 THEN 'Excellent'
WHEN score >= 80 THEN 'Good'
WHEN score >= 70 THEN 'Average'
ELSE 'Fail'
END AS grade
FROM results;
Oracle에서 DECODE는 간단한 조건에 유용합니다.
비교가 많아질수록 CASE 구문을 사용하는 것이 좋습니다.
-- Oracle
SELECT
DECODE(SIGN(score-90), 1, 'Fail', 'Pass') AS pass_fail
FROM results;
PostgreSQL의 NOW()는 현재의 날짜와 시간을 반환합니다.
-- PostgreSQL
SELECT NOW();
Oracle의 SYSDATE도 현재 날짜와 시간을 반환합니다. 두 함수는 동일한 목적을 가지고 있습니다.
-- Oracle
SELECT SYSDATE FROM dual;
시퀀스는 일련번호를 생성할 때 사용됩니다.
-- PostgreSQL
CREATE SEQUENCE user_seq;
SELECT NEXTVAL('user_seq');
-- Oracle
CREATE SEQUENCE user_seq START WITH 1 INCREMENT BY 1;
SELECT user_seq.NEXTVAL FROM dual;
두 함수는 NULL 값을 다른 값으로 대체하는 데 사용됩니다.
-- PostgreSQL
SELECT COALESCE(username, 'Guest') FROM users;
-- Oracle
SELECT NVL(username, 'Guest') FROM users;
재귀 쿼리를 사용하여 계층적 데이터를 조회합니다.
-- PostgreSQL
WITH RECURSIVE subordinates AS (
SELECT employee_id, employee_name, manager_id
FROM employees
WHERE manager_id IS NULL -- 시작 포인트
UNION ALL
SELECT e.employee_id, e.employee_name, e.manager_id
FROM employees e
JOIN subordinates s ON s.employee_id = e.manager_id
)
SELECT * FROM subordinates;
-- Oracle
SELECT employee_id, employee_name, manager_id
FROM employees
START WITH manager_id IS NULL -- 시작 포인트
CONNECT BY PRIOR employee_id = manager_id;
외부 조인을 사용하여 테이블 간에 일치하지 않는 행도 포함하여 결과를 반환합니다.
-- PostgreSQL
SELECT e.name, d.name
FROM employees e
LEFT JOIN departments d ON e.department_id = d.department_id;
-- Oracle
SELECT e.name, d.name
FROM employees e, departments d
WHERE e.department_id = d.department_id(+);
데이터 타입을 명시적으로 변환합니다.
-- PostgreSQL
SELECT
column_name::INTEGER
FROM table_name;
-- Oracle
SELECT
CAST(column_name AS INTEGER)
FROM table_name;