Casting

Casting (형변환)

Casting은 특정 데이터 타입의 값을 다른 데이터 타입의 대응되는 값으로 변환하는 연산이에요. 암시적 또는 명시적으로 일어날 수 있어요. 여기서 설명하는 문법은 명시적 cast를 수행해요.

출처: 문서

본문

Casting은 특정 데이터 타입의 값을 다른 데이터 타입의 대응되는 값으로 변환하는 연산이에요. Casting은 암시적 또는 명시적으로 일어날 수 있어요. 여기서 설명하는 문법은 명시적 cast를 수행해요. Casting에 대한 더 많은 정보는 typecasting 페이지에서 확인할 수 있어요.

명시적 Casting

명시적 casting의 표준 SQL 문법은 CAST(expr AS TYPENAME)이에요. 여기서 TYPENAMEDuckDB 데이터 타입 중 하나의 이름(또는 별칭)이에요. 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가 가능한 것은 아니에요. 예를 들어 INTEGERDATE로 변환하는 것은 불가능해요. 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)