2026년 08월 01일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01790 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01790 expression must have same datatype as corresponding expression 는?
ORA-01790 에러는 UNION, UNION ALL, INTERSECT, MINUS 등의 집합 연산자(Set Operator)를 사용할 때, 각 SELECT 절에서 대응되는 컬럼의 데이터 타입이 서로 일치하지 않을 경우 발생하는 에러입니다. Oracle은 집합 연산을 수행할 때 각 쿼리 블록의 동일한 위치에 있는 컬럼이 반드시 호환 가능한 데이터 타입을 가져야 한다고 요구합니다. 예를 들어, 첫 번째 SELECT에서 NUMBER 타입의 컬럼을, 두 번째 SELECT에서 VARCHAR2 타입의 컬럼을 같은 위치에 놓으면 이 에러가 즉시 발생합니다.
주요 발생 원인
- UNION / UNION ALL 사용 시 컬럼 데이터 타입 불일치
가장 흔한 원인으로, 두 개 이상의 쿼리를 UNION 또는 UNION ALL로 합칠 때 같은 순서에 위치한 컬럼의 데이터 타입이 다른 경우입니다. 예를 들어 한쪽 쿼리에서는 employee_id(NUMBER)를 첫 번째 컬럼으로 선택하고, 다른 쪽 쿼리에서는 employee_name(VARCHAR2)을 첫 번째 컬럼으로 선택했을 때 발생합니다. 개발자가 컬럼 순서를 실수로 바꾸거나, 서로 다른 테이블 구조를 합칠 때 자주 나타납니다.
- 날짜(DATE)와 문자열(VARCHAR2) 또는 숫자(NUMBER) 타입 혼용
날짜 컬럼과 문자열 컬럼을 명시적 변환 없이 집합 연산에 사용할 때 발생합니다. 실무에서는 레거시 시스템과 신규 시스템을 통합할 때, 같은 의미의 날짜 정보가 한쪽은 DATE 타입으로, 다른 쪽은 VARCHAR2 타입으로 저장되어 있는 경우가 매우 많습니다. 이 경우 TO_DATE() 또는 TO_CHAR() 등의 변환 함수를 사용하지 않으면 반드시 ORA-01790이 발생합니다.
- 서브쿼리나 인라인 뷰에서의 암묵적 타입 혼용
복잡한 쿼리 구조에서 인라인 뷰나 WITH 절(CTE)을 사용할 때, 내부 쿼리의 컬럼 타입이 외부 쿼리와 맞지 않는 경우입니다. 특히 CASE WHEN 표현식이나 NVL, DECODE 함수를 사용할 때 결과 타입이 예상과 다르게 결정되어 집합 연산에서 충돌이 생기는 경우가 많습니다. 이런 경우는 에러 원인을 파악하기가 비교적 어렵기 때문에 각 컬럼의 타입을 명시적으로 확인하는 습관이 중요합니다.
해결 방법
원인 1 해결: 명시적 타입 변환(CAST 또는 TO_CHAR / TO_NUMBER 사용)
아래는 NUMBER 타입과 VARCHAR2 타입이 충돌하는 예시와 해결 방법입니다.
-- 에러 발생 예시
SELECT employee_id, employee_name FROM employees
UNION ALL
SELECT dept_name, dept_id FROM departments;
-- ORA-01790: employee_id(NUMBER) vs dept_name(VARCHAR2) 충돌
-- 해결 방법 1: TO_CHAR()로 NUMBER를 문자열로 변환
SELECT TO_CHAR(employee_id) AS id_col, employee_name AS name_col
FROM employees
UNION ALL
SELECT dept_name, TO_CHAR(dept_id)
FROM departments;
-- 해결 방법 2: CAST() 함수를 사용하여 명시적 변환
SELECT CAST(employee_id AS VARCHAR2(20)) AS id_col, employee_name
FROM employees
UNION ALL
SELECT dept_name, CAST(dept_id AS VARCHAR2(20))
FROM departments;
원인 2 해결: DATE와 VARCHAR2 타입 통일
-- 에러 발생 예시
SELECT order_date FROM new_orders -- DATE 타입
UNION
SELECT order_date FROM old_orders; -- VARCHAR2 타입 (레거시 시스템)
-- ORA-01790 발생
-- 해결 방법 1: VARCHAR2를 DATE로 변환
SELECT order_date FROM new_orders
UNION
SELECT TO_DATE(order_date, 'YYYY-MM-DD') FROM old_orders;
-- 해결 방법 2: 모두 VARCHAR2로 통일 (리포팅 목적)
SELECT TO_CHAR(order_date, 'YYYY-MM-DD') AS order_date FROM new_orders
UNION
SELECT order_date FROM old_orders;
원인 3 해결: CASE WHEN / NVL 표현식에서의 타입 확인
-- 에러 발생 예시 (CASE 결과 타입 혼용)
SELECT CASE WHEN status = 'A' THEN 1 ELSE 'N/A' END AS status_val
FROM orders_v1
UNION ALL
SELECT status_code FROM orders_v2;
-- CASE 결과가 NUMBER/VARCHAR2 혼용으로 ORA-01790 발생
-- 해결 방법: CASE 내 모든 THEN/ELSE 결과를 동일한 타입으로 맞춤
SELECT CASE WHEN status = 'A' THEN '1' ELSE 'N/A' END AS status_val
FROM orders_v1
UNION ALL
SELECT TO_CHAR(status_code) FROM orders_v2;
-- NVL 사용 시 타입 확인 예시
SELECT NVL(TO_CHAR(salary), 'N/A') AS salary_info FROM employees
UNION ALL
SELECT NVL(contract_salary, 'N/A') FROM contractors;
-- 두 NVL 결과 모두 VARCHAR2로 통일됨
실무 팁: 컬럼 데이터 타입 사전 확인 쿼리
-- 특정 테이블의 컬럼 타입 조회
SELECT column_name, data_type, data_length, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
ORDER BY column_id;
-- 두 테이블의 동일 컬럼 타입 비교 (UNION 전 검증용)
SELECT 'EMPLOYEES' AS tbl, column_name, data_type, column_id
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
UNION ALL
SELECT 'DEPARTMENTS', column_name, data_type, column_id
FROM user_tab_columns
WHERE table_name = 'DEPARTMENTS'
ORDER BY column_id, tbl;
예방 방법
- UNION/UNION ALL 작성 전 컬럼 타입 사전 검증 습관화
집합 연산 쿼리를 작성하기 전에 반드시 USER_TAB_COLUMNS 또는 ALL_TAB_COLUMNS 뷰를 통해 각 테이블의 컬럼 데이터 타입을 비교 확인하는 습관을 들이세요. 특히 서로 다른 팀이나 시스템에서 관리하는 테이블을 합칠 때는 데이터 타입 매핑 문서를 작성하는 것이 좋습니다. CI/CD 파이프라인이나 코드 리뷰 단계에서 집합 연산 쿼리에 대한 타입 검증 단계를 추가하면 운영 환경에서의 장애를 예방할 수 있습니다.
- 명시적 타입 변환 함수 적극 사용 및 코딩 컨벤션 수립
암묵적 타입 변환에 의존하지 말고, 항상 TO_CHAR(), TO_NUMBER(), TO_DATE(), CAST() 등의 명시적 변환 함수를 사용하는 코딩 컨벤션을 팀 내에 수립하세요. Oracle은 일부 상황에서 암묵적 변환을 허용하지만, 이는 성능 저하와 예상치 못한 에러의 원인이 될 수 있습니다. 특히 신규 개발자가 많은 팀에서는 SQL 코드 리뷰 체크리스트에 “집합 연산 컬럼 타입 일치 여부 확인” 항목을 반드시 포함시키는 것을 권장합니다.
관련 에러
- ORA-01789:
query block has incorrect number of result columns— UNION/UNION ALL 사용 시 컬럼 개수가 맞지 않을 때 발생하는 에러로, ORA-01790과 함께 자주 나타납니다. - ORA-01722:
invalid number— 문자열을 숫자로 암묵적 변환하려 할 때 변환이 불가능한 값이 있는 경우 발생합니다. 타입 불일치 수정 과정에서 TO_NUMBER() 사용 시 주의가 필요합니다. - ORA-01858:
a non-numeric character was found where a numeric was expected— 날짜 변환 과정에서 잘못된 형식의 문자열을 DATE로 변환할 때 발생하며, ORA-01790 해결 과정에서 TO_DATE() 사용 시 함께 마주칠 수 있습니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.