Casting
Casting (형변환)
Casting은 특정 데이터 타입의 값을 다른 데이터 타입의 대응되는 값으로 변환하는 연산이에요. 암시적 또는 명시적으로 일어날 수 있어요. 여기서 설명하는 문법은 명시적 cast를 수행해요.
출처: 문서
본문
Casting은 특정 데이터 타입의 값을 다른 데이터 타입의 대응되는 값으로 변환하는 연산이에요. Casting은 암시적 또는 명시적으로 일어날 수 있어요. 여기서 설명하는 문법은 명시적 cast를 수행해요. Casting에 대한 더 많은 정보는 typecasting 페이지에서 확인할 수 있어요.
명시적 Casting
명시적 casting의 표준 SQL 문법은 CAST(expr AS TYPENAME)이에요. 여기서 TYPENAME은 DuckDB 데이터 타입 중 하나의 이름(또는 별칭)이에요. DuckDB는 PostgreSQL에도 있는 줄임말 expr::TYPENAME도 지원해요.
SELECT CAST(i AS VARCHAR) AS i
FROM generate_series(1, 3) tbl(i);
| i |
|---|
| 1 |
| 2 |
| 3 |
SELECT i::DOUBLE AS i
FROM generate_series(1, 3) tbl(i);
| i |
|---|
| 1.0 |
| 2.0 |
| 3.0 |
Casting 규칙
모든 cast가 가능한 것은 아니에요. 예를 들어 INTEGER를 DATE로 변환하는 것은 불가능해요. Cast가 성공적으로 수행될 수 없을 때 cast는 오류를 발생시킬 수도 있어요. 예를 들어 문자열 'hello'를 INTEGER로 cast하려고 하면 오류가 발생해요.
SELECT CAST('hello' AS INTEGER);
Conversion Error:
Could not convert string 'hello' to INT32
Cast의 정확한 동작은 소스와 대상 타입에 따라 달라져요. 예를 들어 VARCHAR에서 다른 타입으로 cast할 때 문자열을 변환하려고 시도해요.
숫자 타입 간 casting은 반올림 영향이 있을 수 있어요. 적용 가능한 반올림 규칙은 NUMERIC 타입 페이지에서 확인할 수 있어요.
TRY_CAST
오류를 던지지 않고 대신 NULL 값을 반환하는 것이 선호되는 동작이라면 TRY_CAST를 사용할 수 있어요. TRY_CAST는 절대 오류를 던지지 않고, cast가 불가능하면 NULL을 반환해요.
SELECT TRY_CAST('hello' AS INTEGER) AS i;
| i |
|---|
| NULL |
cast_to_type 함수
cast_to_type 함수는 표현식에서 다른 컬럼의 타입으로 cast를 생성할 수 있게 해요. 예를 들어:
SELECT cast_to_type('42', NULL::INTEGER) AS result;
┌───────┐
│ res │
│ int32 │
├───────┤
│ 42 │
└───────┘
이 함수는 주로 매크로에서 유용해요. 타입을 유지할 수 있게 해주기 때문이에요. 이는 서로 다른 타입에서 동작하는 일반적인 매크로를 만드는 데 도움이 돼요. 예를 들어 다음 매크로는 입력이 INTEGER이면 숫자에 더해요.
CREATE TABLE tbl (i INT, s VARCHAR);
INSERT INTO tbl VALUES (42, 'hello world');
CREATE MACRO conditional_add(col, nr) AS
CASE
WHEN typeof(col) == 'INTEGER' THEN cast_to_type(col::INTEGER + nr, col)
ELSE col
END;
SELECT conditional_add(COLUMNS(*), 100) FROM tbl;
┌───────┬─────────────┐
│ i │ s │
│ int32 │ varchar │
├───────┼─────────────┤
│ 142 │ hello world │
└───────┴─────────────┘
CASE 문은 모든 코드 경로에서 동일한 타입을 반환해야 한다는 점에 주의해요. 원하는 타입으로의 cast를 추가해 어떤 입력 컬럼에서든 더하기를 수행할 수 있지만, 바인딩이 동작하도록 더하기 결과를 소스 타입으로 다시 cast해야 해요.
더 알아보기 (Learn more)
- Typecasting 페이지에서 cast 규칙을 더 자세히 살펴볼 수 있어요.