標準 SQL 中的轉換規則

「轉換」包括但不限於類型轉換與強制轉換。

  • 類型轉換需要手動轉換,使用的是 CAST() 函式。
  • 強制轉換是自動轉換,BigQuery 會在以下所述情況中自動執行。
  • 此外,第三組轉換函式具有專屬的函式名稱,例如 UNIX_DATE()

下表大致列出 BigQuery 資料類型的所有 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(x=1 AS STRING)

如果 x 是 1,這會產生 "true",其他非 NULL 值則會產生 "false",如果 x 是 NULL 則會產生 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 位,就會四捨五入。轉換 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 類型的精確度或範圍上限,否則將產生錯誤。如果小數點後超過九位數,則產生的 NUMERIC 值將四捨五入,保留小數點後最多九位數。
STRING BOOL 如果 x"true" 就傳回 TRUE,如果 x 是 "false" 就傳回 FALSE
x 的其他所有值無效,會擲回錯誤而非將類型轉換為 BOOL。
將類型轉換為 BOOL 時,STRING 區分大小寫。
STRING BYTES STRING 使用 UTF-8 編碼將類型轉換為 BYTES。例如,將 STRING「©」的類型轉換為 BYTES 時,會變成含有十六進位值 C2 與 A9 的 2 位元組順序。
BYTES STRING 傳回解讀為 UTF-8 STRING 的 x
以 BYTES 常值 b'\xc2\xa9' 為例,將類型轉換為 STRING 時,會解讀為 UTF-8 並變成 unicode 字元「©」。
如果 x 不是有效的 UTF-8,就會發生錯誤。
ARRAY ARRAY 必須是完全相同的 ARRAY 類型。
STRUCT STRUCT 如果符合以下條件就允許:
  1. 這兩個 STRUCT 具有相同的欄位數。
  2. 原始 STRUCT 欄位類型可手動轉換為對應目標 STRUCT 欄位類型 (如欄位順序定義,而非如欄位名稱定義)。

安全類型轉換

當使用 CAST 時,如果 BigQuery 無法執行類型轉換,查詢可能會失敗。例如,下列查詢會產生錯誤:

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

如果您要保護查詢免於發生這些類型的錯誤,可以使用 SAFE_CASTSAFE_CASTCAST 相同,但它會傳回 NULL,而非產生錯誤。

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

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

如果您要將類型從位元組轉換成字串,也可以使用 SAFE_CONVERT_BYTES_TO_STRING 函式。任何無效的 UTF-8 字元都會取代為 U+FFFD Unicode 取代字元。詳情請參閱 SAFE_CONVERT_BYTES_TO_STRING 一節。

將十六進位字串類型轉換為整數

如果您打算使用十六進位字串 (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 解讀時間戳記。產生的次秒位數取決於次秒部分的結尾零數:CAST 函式會截斷零、三或六位數。

將類型從字串轉換為時間戳記時,string_expression 必須符合支援的時間戳記常值格式,否則會發生執行階段錯誤。string_expression 本身可能包含 time_zone,詳情請參閱時區一節。 如果 string_expression 中有時區,會使用那個時區進行轉換,否則會使用預設 UTC 時區。 如果字串少於六位數,會將自動加寬。

如果 string_expression 無效、次秒有六位數以上 (精確度大於毫秒),或顯示的時間超出支援的時間戳記範圍,就會產生錯誤。

在日期與時間戳記類型之間轉換

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 引數,運算式 func("2014-09-27") 就有效,因為 STRING 常值 "2014-09-27" 已強制轉換為 DATE。

分析時會評估常值強制轉換,如果輸入的常值無法成功轉換為目標類型,就會產生錯誤。

附註:字串常值不會強制轉換為數字類型。

參數強制轉換

BigQuery 支援下列參數強制轉換方式:

輸入資料類型 結果資料類型
STRING 參數

如果參數值無法成功強制轉換為目標類型,就會產生錯誤。

其他轉換函式

BigQuery 提供下列其他轉換函式:

本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
需要協助嗎?請前往我們的支援網頁