상상해봐, 숫자 두 개를 더하고 싶은데 그 중 하나가 문자열로 저장돼 있어. 아니면, 연도 기준으로 데이터를 필터링하고 싶은데 날짜가 시간까지 포함된 전체 포맷으로 저장돼 있지. PostgreSQL은 이런 상황을 별로 좋아하지 않아서, 네가 직접 데이터 타입을 맞춰줘야 해.
타입 변환이 도와주는 상황:
- 데이터를 계산에 쓸 수 있게 더 쉽게 다룰 수 있어.
- 내보내기나 분석할 때 더 읽기 쉽고 구조화된 데이터 만들 수 있어.
- 데이터 타입이 안 맞아서 생기는 에러를 없앨 수 있어.
데이터 타입 변환의 기본: CAST()랑 ::
1. CAST() — 모든 변환의 큰형
CAST() 함수는 값을 한 데이터 타입에서 다른 타입으로 바꾸는 "공식" 방법이야. 거의 만능 번역기 같은 느낌이지.
문법:
CAST(값 AS 목표_데이터_타입)
예시 1: 문자열을 숫자로 변환하기.
SELECT CAST('123' AS INTEGER); -- 결과: 123
예시 2: 숫자를 문자열로 변환하기.
SELECT CAST(123 AS TEXT); -- 결과: '123'
예시 3: 날짜를 문자열로 변환하기.
SELECT CAST(NOW() AS TEXT); -- 결과: '2023-10-25 15:00:00.000000'
2. :: 연산자 — 간단한 대안
CAST()가 좀 길다고 느껴지면, PostgreSQL에서는 :: 문법도 있어. 이건 짧아서 많이 쓰이는 변환 방법이야.
문법:
값::목표_데이터_타입
예시 1: 문자열을 숫자로 변환하기.
SELECT '123'::INTEGER; -- 결과: 123
예시 2: 숫자를 문자열로 변환하기.
SELECT 123::TEXT; -- 결과: '123'
예시 3: 날짜를 문자열로 변환하기.
SELECT NOW()::TEXT; -- 결과: '2023-10-25 15:00:00.000000'
실전에서 타입 변환 쓰는 예시들
1. 숫자랑 문자열 변환하기
예를 들어, students 테이블이 있는데 student_id 컬럼이 문자열로 저장돼 있다고 해봐. 근데 이걸 숫자 값이랑 비교하고 싶어. 변환 없이 하면 절대 안 돼.
| student_id | first_name | last_name | birth_date | grade |
|---|---|---|---|---|
| 101 | Alex | Lin | 2008-03-15 | 9 |
| 102 | Maria | Chi | 2009-07-22 | 8 |
| 103 | Axel | Ivy | 2007-11-30 | 10 |
| 104 | Nat | Sok | 2008-01-18 | 9 |
| 105 | Pol | Frez | 2009-05-05 | 8 |
그래서 쿼리에서 student_id 컬럼을 숫자로 명시적으로 변환해야 해:
SELECT *
FROM students
WHERE student_id::INTEGER = 101;
CAST()로도 똑같이 할 수 있어:
SELECT *
FROM students
WHERE CAST(student_id AS INTEGER) = 101;
날짜 변환하기
날짜의 일부만 뽑거나 문자열로 바꿔야 할 때도 타입 변환이 필요해. 예를 들어, courses 테이블에 start_date 컬럼이 있다고 해보자.
| course_id | course_name | start_date |
|---|---|---|
| 1 | 파이썬 입문 | 2025-01-15 |
| 2 | SQL 기초 | 2025-03-01 |
| 3 | 데이터 분석 | 2025-05-10 |
| 4 | 웹 개발 | 2025-06-20 |
| 5 | 머신러닝 | 2025-09-05 |
예시: 연도를 숫자로 뽑기.
SELECT start_date::DATE, start_date::TEXT, start_date::TIMESTAMP
FROM courses;
결과는 이렇게 나와:
| start_date (DATE) | start_date (TEXT) | start_date (TIMESTAMP) |
|---|---|---|
| 2025-01-15 | 2025-01-15 | 2025-01-15 00:00:00 |
| 2025-03-01 | 2025-03-01 | 2025-03-01 00:00:00 |
| 2025-05-10 | 2025-05-10 | 2025-05-10 00:00:00 |
| 2025-06-20 | 2025-06-20 | 2025-06-20 00:00:00 |
| 2025-09-05 | 2025-09-05 | 2025-09-05 00:00:00 |
예시: 날짜를 "깔끔한 문자열"로 변환하기.
SELECT TO_CHAR(start_date, 'DD-MM-YYYY')
결과는 이렇게 나와:
| to_char |
|---|
| 15-01-2025 |
| 01-03-2025 |
| 10-05-2025 |
| 20-06-2025 |
| 05-09-2025 |
에러: 변환이 깨질 때는 언제?
데이터 변환 트릭이 항상 통하는 건 아니야. 가끔 PostgreSQL이 "이해 못 하겠다"는 식으로 에러를 내기도 해. 대표적인 예시: 숫자처럼 보이지만 쓸데없는 문자가 들어간 텍스트를 숫자로 바꾸려고 할 때.
에러 예시:
SELECT '123abc'::INTEGER;
-- 에러: integer 타입에 맞지 않는 입력 문법: "123abc"
이런 문제를 피하려면, 데이터가 진짜로 목표 타입으로 변환될 수 있는지 미리 확인해야 해. 예를 들어, 정규표현식이나 추가 체크를 쓸 수 있지.
GO TO FULL VERSION