표준 SQL의 변환 규칙

'변환'에는 Cast 변환과 강제가 포함되며 이에 국한되지 않습니다.

  • 변환은 명시적 변환으로, CAST() 함수를 사용합니다.
  • 강제 변환은 암시적 변환으로, 아래 설명된 조건에 따라 BigQuery가 자동으로 수행합니다.
  • UNIX_DATE()와 같은 자체 함수 이름을 가진 세 번째 변환 함수 그룹이 있습니다.

아래 표에는 BigQuery 데이터 유형에 사용할 수 있는 모든 CAST 및 강제 변환이 요약되어 있습니다. '강제 변환 대상'은 특정 데이터 유형(예: 열)의 모든 표현식에 적용되지만 리터럴과 매개변수도 강제 변환될 수 있습니다. 자세한 내용은 리터럴 강제 변환매개변수 강제 변환을 참조하세요.

원본 유형 CAST 대상 강제 변환 대상
INT64 BOOL
INT64
NUMERIC
FLOAT64
STRING
FLOAT64
NUMERIC
NUMERIC INT64
NUMERIC
FLOAT64
STRING
FLOAT64
FLOAT64 INT64
NUMERIC
FLOAT64
STRING
 
BOOL BOOL
INT64
STRING
 
STRING BOOL
INT64
NUMERIC
FLOAT64
STRING
BYTES
DATE
DATETIME
TIME
TIMESTAMP
 
BYTES BYTES
STRING
 
DATE DATE
DATETIME
STRING
TIMESTAMP
 
DATETIME DATE
DATETIME
STRING
TIME
TIMESTAMP
 
TIME STRING
TIME
 
TIMESTAMP DATE
DATETIME
STRING
TIME
TIMESTAMP
 
ARRAY ARRAY  
STRUCT STRUCT  

변환

구문:

CAST(expr AS typename)

쿼리에서 사용되는 Cast 구문은 표현식의 결과 유형이 다른 유형으로 변환되어야 함을 나타냅니다.

예:

CAST(x=1 AS STRING)

x1이면 "true"이고, NULL 외의 값이면 "false"이고, xNULL이면 NULL입니다.

원본 값에서 대상 도메인으로 성공적으로 매핑되지 못하는 지원 유형 간의 변환은 런타임 오류를 유발합니다. 예를 들어 BYTES를 STRING으로 변환하는데 바이트 시퀀스가 유효한 UTF-8이 아닌 경우에는 런타임 오류가 발생합니다.

다음 유형의 x 표현식을 변환할 때는 다음과 같은 규칙이 적용됩니다.

원본 대상 x 변환 시 규칙
INT64 FLOAT64 가깝지만 정확하지 않을 수 있는 FLOAT64 값을 반환합니다.
INT64 BOOL x0이면 FALSE, 그렇지 않으면 TRUE를 반환합니다.
NUMERIC 부동 소수점 NUMERIC은 가장 가까운 부동 소수점 수로 변환되며 정밀도가 떨어질 수 있습니다.
FLOAT64 INT64 가장 가까운 INT64 값을 반환합니다.
1.5나 -0.5와 같은 중간 값은 0에서 멀어지는 방향으로 반올림됩니다.
FLOAT64 STRING 근사치의 문자열 표시를 반환합니다.
FLOAT64 NUMERIC 부동 소수점 수의 소수점 이하 자릿수가 9자리를 넘으면 0에서 멀어지는 방향으로 반올림됩니다. NaN, +inf 또는 -inf 변환은 오류를 반환합니다. NUMERIC의 범위를 벗어난 값을 변환하면 오버플로 오류가 반환됩니다.
BOOL INT64 xTRUE이면 1, 그렇지 않으면 0을 반환합니다.
BOOL STRING xTRUE이면 "true", 그렇지 않으면 "false"를 반환합니다.
STRING FLOAT64 x를 FLOAT64 값으로 반환하며, 유효한 FLOAT64 리터럴과 동일한 형식을 지니는 것으로 해석합니다.
"inf", "+inf", "-inf", "nan"의 변환도 지원합니다.
변환 시 대소문자를 구분하지 않습니다.
STRING NUMERIC STRING에 포함된 숫자 리터럴은 NUMERIC 유형의 최대 정밀도 또는 범위를 초과하면 안 됩니다. 초과하면 오류가 발생합니다. 소수점 이하 자릿수가 9자리를 초과하면 결과 NUMERIC 값은 소수점 이하 자릿수가 9자리가 되도록 0에서 멀어지는 방향으로 반올림됩니다.
STRING BOOL x"true"이면 TRUE, x"false"이면 FALSE를 반환합니다.
그 밖에 다른 x 값은 유효하지 않으며 이 경우 BOOL로 변환하지 않고 오류가 발생합니다.
STRING은 BOOL로 변환 시 대소문자를 구분하지 않습니다.
STRING BYTES STRING은 UTF-8 인코딩을 사용하여 BYTES로 변환됩니다. 예를 들어 STRING '©'는 BYTES로 변환될 때 16진수 값 C2와 A9를 갖는 2바이트 시퀀스가 됩니다.
BYTES STRING UTF-8 STRING으로 해석되는 x를 반환합니다.
예를 들어 BYTES 리터럴 b'\xc2\xa9'는 STRING으로 변환될 때 UTF-8로 해석되어 유니코드 문자 '©'가 됩니다.
x가 유효한 UTF-8이 아닌 경우, 오류가 발생합니다.
ARRAY ARRAY 정확히 동일한 ARRAY 유형이어야 합니다.
STRUCT STRUCT 다음 조건이 충족될 경우에 허용됩니다.
  1. 두 STRUCT의 필드 개수가 같습니다.
  2. 원본 STRUCT 필드 유형을 해당 대상 STRUCT 필드 유형으로 명시적으로 변환할 수 있습니다(필드 이름이 아니라 필드 순서에 의해 정의된 대로).

Safe casting

CAST 사용 시 BigQuery가 변환을 수행할 수 없으면 쿼리가 실패할 수 있습니다. 예를 들어 다음 쿼리는 오류를 생성합니다.

SELECT CAST("apple" AS INT64) AS not_a_number;

이런 유형의 오류에서 쿼리를 보호하기 위해 SAFE_CAST를 사용할 수 있습니다. SAFE_CAST는 오류를 발생시키지 않고 NULL을 반환한다는 점을 제외하면 CAST와 동일합니다.

SELECT SAFE_CAST("apple" AS INT64) AS not_a_number;

+--------------+
| not_a_number |
+--------------+
| NULL         |
+--------------+

바이트에서 문자열로 변환하려면 SAFE_CONVERT_BYTES_TO_STRING 함수를 사용해도 됩니다. 유효하지 않은 UTF-8 문자는 유니코드 대체 문자 U+FFFD로 대체됩니다. 자세한 내용은 SAFE_CONVERT_BYTES_TO_STRING을 참조하세요.

16진수 문자열을 정수로 변환

16진수 문자열(0x123)로 작업하는 경우, 이 문자열을 정수로 변환할 수 있습니다.

SELECT '0x123' as hex_value, CAST('0x123' as INT64) as hex_to_int;

+-----------+------------+
| hex_value | hex_to_int |
+-----------+------------+
| 0x123     | 291        |
+-----------+------------+

SELECT '-0x123' as hex_value, CAST('-0x123' as INT64) as hex_to_int;

+-----------+------------+
| hex_value | hex_to_int |
+-----------+------------+
| -0x123    | -291       |
+-----------+------------+

날짜 유형 변환

BigQuery는 다음과 같이 날짜 유형과 문자열 간의 변환을 지원합니다.

CAST(date_expression AS STRING)
CAST(string_expression AS DATE)

날짜 유형을 문자열로 변환하는 것은 시간대와 관계가 없으며 YYYY-MM-DD 형태를 갖습니다. 문자열에서 날짜로 변환할 경우, 문자열이 지원되는 날짜 리터럴 형식과 일치해야 하며, 이는 시간대와 관계가 없습니다. 문자열 표현식이 유효하지 않거나 지원되는 최소/최대 범위 밖의 날짜를 나타낼 경우, 오류가 발생합니다.

타임스탬프 유형 변환

BigQuery는 다음과 같이 타임스탬프 유형과 문자열 간의 변환을 지원합니다.

CAST(timestamp_expression AS STRING)
CAST(string_expression AS TIMESTAMP)

타임스탬프 유형에서 문자열로 변환할 경우, 타임스탬프가 기본 시간대인 UTC를 사용하여 해석됩니다. 생성되는 1초 미만 자릿수의 개수는 1초 미만 단위에 따라오는 0의 개수에 따라 결정됩니다. CAST 함수는 0, 3 또는 6자릿수를 잘라냅니다.

문자열에서 타임스탬프로 변환할 경우, string_expression이 지원되는 타임스탬프 리터럴 형식과 일치해야 하며, 그렇지 않은 경우 런타임 오류가 발생합니다. string_expressiontime_zone이 포함될 수 있습니다. 시간대를 참조하세요. string_expression에 시간대가 있으면 해당 시간대가 변환에 사용되고, 그렇지 않으면 기본 시간대인 UTC가 사용됩니다. 문자열이 6자리 미만이면 암시적으로 확장됩니다.

string_expression이 유효하지 않거나 1초 미만 자릿수가 6개보다 많거나(즉, 정밀도가 마이크로초 이상인 경우), 지원되는 타임스탬프 범위 밖의 시간을 나타내는 경우 오류가 발생합니다.

날짜 유형과 타임스탬프 유형 간 변환

BigQuery는 다음과 같이 날짜 유형과 타임스탬프 유형 간의 변환을 지원합니다.

CAST(date_expression AS TIMESTAMP)
CAST(timestamp_expression AS DATE)

날짜에서 타임스탬프로 변환할 경우 date_expression은 기본 시간대인 UTC의 자정(하루의 시작)을 기준으로 해석됩니다. 타임스탬프에서 날짜로 변환할 경우 기본 시간대를 기준으로 타임스탬프를 효과적으로 잘라냅니다.

강제

BigQuery는 함수 서명을 일치시켜야 하는 경우 표현식의 결과 유형을 다른 유형으로 강제합니다. 예를 들어 함수 func()가 INT64 유형의 단일 인수를 취하도록 정의되어 있고, 표현식이 FLOAT64의 결과 유형을 갖는 인수로 사용되는 경우 이 표현식의 결과는 func()가 계산되기 전에 INT64 유형으로 강제됩니다.

리터럴 강제

BigQuery는 다음과 같은 리터럴 강제를 지원합니다.

입력 데이터 유형 결과 데이터 유형 참고
STRING 리터럴 DATE
TIMESTAMP

리터럴 강제는 실제 리터럴 유형이 해당 함수가 예상하는 유형과 다를 경우에 필요합니다. 예를 들어 함수 func()가 DATE 인수를 취하는 경우, STRING 리터럴 "2014-09-27"이 DATE로 강제되기 때문에 표현식 func("2014-09-27")은 유효합니다.

리터럴 강제는 분석 시 평가되며, 입력 리터럴을 대상 유형으로 성공적으로 변환할 수 없는 경우 오류가 발생합니다.

참고: 문자열 리터럴은 숫자 유형으로 강제되지 않습니다.

매개변수 강제

BigQuery는 다음과 같은 매개변수 강제를 지원합니다.

입력 데이터 유형 결과 데이터 유형
STRING 매개변수

매개변수 값을 대상 유형으로 성공적으로 강제할 수 없는 경우 오류가 발생합니다.

기타 변환 함수

BigQuery는 다음과 같은 변환 함수를 추가로 제공합니다.

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

도움이 필요하시나요? 지원 페이지를 방문하세요.