共用方式為


cast函式

適用於:核取記號為「是」Databricks SQL 核取記號為「是」Databricks Runtime

將值 expr 轉換成目標資料類型 type。 此運算子是 (冒號冒號) 運算子的::同義字

語法

cast(sourceExpr AS targetType)

引數

  • sourceExpr:任何可轉換的表達式。
  • targetType:結果的數據類型。

退貨

結果為類型 targetType

資料類型轉換的下列組合有效:

來源(欄) 目標(欄) 無效 數值 字串 日期 時間戳 TIMESTAMP_NTZ 年-月間隔 日間時間間隔 布林 二元的 陣列 地圖 結構 變體 物件
無效
數值
字串
日期
時間戳
TIMESTAMP_NTZ
年-月間隔
日間時間間隔
布林
二元的
陣列
地圖
結構
變體
物件

以 targetType 為基礎的規則和限制

警告

在 Databricks Runtime 中,如果 spark.sql.ansi.enabledfalse,則溢位不會造成錯誤,而是會「包裝」結果。

sourceExpr 的值如果具有 targetType 無效格式或無效字元,會導致 NULL

數字的

targetType如果 是數值,且 sourceExpr 類型為:

  • 無效

    結果是 NULL 指定之數值類型的 。

  • 數值

    如果 targetType整數數值,則結果會sourceExpr截斷為整數。

    否則,結果會sourceExpr四捨五入以符合targetType的可用小數位數。

    如果值超出的範圍 targetType,則會引發溢位錯誤。

    使用 try_cast 將溢位錯誤轉換成 NULL

  • 字串

    sourceExpr 會被讀取為 targetType 的字面值。

    如果 sourceExpr 不符合常值的格式,則會引發錯誤。

    如果值超出的範圍 targetType,則會引發溢位錯誤。

    使用 try_cast 將溢位與不合法格式錯誤轉換成 NULL

  • 時間戳

    結果是1970-01-01 00:00:00 UTCsourceExpr之間經過的秒數。

    如果 targetType整數數值,則結果會 截斷 為整數。

    否則,結果會被四捨五入,以符合targetType的可用小數位數。

    如果結果超出的範圍 targetType,就會引發溢位錯誤。

    使用 try_cast 將溢位錯誤轉換成 NULL

  • 間隔

    適用於:核取記號為「是」 Databricks SQL 核取記號為「是」 Databricks Runtime 11.3 LTS 和更新版本

    目標類型必須是 確切的數值

    給定一個INTERVAL upper_unit TO lower_unit,結果是以總數lower_unit來測量。 lower_unit如果 為 SECOND,小數秒會儲存在小數點右邊。 對於所有其他間隔,結果一律為整數。

  • 布爾

    如果 sourceExpr 為:

    • true:結果為 1。
    • false:結果為 0。
    • NULL:結果為 NULL
  • 變體

    實際值類型 VARIANT 的型別規則適用。

範例

> SELECT cast(NULL AS INT);
  NULL

> SELECT cast(5.6 AS INT);
  5

> SELECT cast(5.6 AS DECIMAL(2, 0));
  6

> SELECT cast(-5.6 AS INT);
  -5

> SELECT cast(-5.6 AS DECIMAL(2, 0));
  -6

> SELECT cast(128 AS TINYINT);
  Overflow

> SELECT cast(128 AS DECIMAL(2, 0));
  Overflow

> SELECT cast('123' AS INT);
  123

> SELECT cast('123.0' AS INT);
  Invalid format

> SELECT cast(TIMESTAMP'1970-01-01 00:00:01' AS LONG);
  1

> SELECT cast(TIMESTAMP'1970-01-01 00:00:00.000001' AS DOUBLE);
  1.0E-6

> SELECT cast(TIMESTAMP'2022-02-01 00:00:00' AS SMALLINT);
  error: overflow
> SELECT cast(true AS BOOLEAN);
  1

> SELECT cast(INTERVAL '1-2' YEAR TO MONTH AS INTEGER);
  14

> SELECT cast(INTERVAL '1:30.5' MINUTE TO SECOND AS DECIMAL(5, 2));
  90.50

> SELECT cast(TRUE AS INT);
  1

> SELECT cast(FALSE AS INT);
  0

> SELECT cast('15'::VARIANT AS INT);
  15

字串

如果 sourceExprSTRING 產生的 STRING 會繼承 sourceExpr的定序。 在所有其他情況下,產生的 STRING 定序使用的是 預設定序

若要變更定序,請新增 定序 表示式。

如果targetTypeSTRING類型,且sourceExpr的類型為:

  • 無效

    結果是 NULL 字串。

  • 精確數值

    結果是具有選擇性減號的常值數位,除了小數點左邊的單一位數以外,沒有前置零。 如果targetType 大於 DECIMAL(p, s)s 大於 0,則會新增小數點,並將尾端零補到小數位數。

  • 浮點二進位

    如果絕對數字小於 10,000,000 且大於或等於 0.001,則結果將不使用科學記數法,並在小數點兩邊至少有一位數字。

    否則,Azure Databricks 會使用 mantissa,後面接著 E 指數。 mantissa 具有選擇性的前置減號,後面接著小數點左邊的一位數,以及右邊大於零的最小位數。 指數可以有一個選擇性的前置減號。

  • 日期

    如果年份介於 9999 BCE 和 9999 CE 之間,則結果是形式為-YYYY-MM-DDYYYY-MM-DD

    在此範圍之前或之後的年份,必要的數字數會新增至年份元件,並 + 用於 CE。

  • 時間戳

    如果年份介於公元前 9999 年和公元後 9999 年之間,則結果是格式為-YYYY-MM-DD hh:mm:ssYYYY-MM-DD hh:mm:ss

    在此範圍之前或之後的年份,必要的數字數會新增至年份元件,並 + 用於 CE。

    必要時會新增小數秒 .f...

  • TIMESTAMP_NTZ

    如果年份介於公元前 9999 年和公元後 9999 年之間,則結果是格式為-YYYY-MM-DD hh:mm:ssYYYY-MM-DD hh:mm:ss

    在此範圍之前或之後的年份,必要的數字數會新增至年份元件,並 + 用於 CE。

    必要時會新增小數秒 .f...

  • 年-月間隔

    結果是區間表示式的最短形式。 如果間隔為負數,則符號會內嵌在 中 interval-string。 對於小於 10 的單位,會省略前置零。

    典型的年月間隔字串格式如下:

    • INTERVAL 'Y' YEAR
    • INTERVAL 'Y-M' YEAR TO MONTH
    • INTERVAL 'M' MONTH
  • 日間時間間隔

    結果是區間表示式的最短形式。 如果間隔為負數,則符號會內嵌在 中 interval-string。 對於小於 10 的單位,會省略前置零。

    一般日時間間隔字串的格式如下:

    • INTERVAL 'D' DAY
    • INTERVAL 'D h' DAY TO HOUR
    • INTERVAL 'D h:m' DAY TO MINUTE
    • INTERVAL 'D h:m:s' DAY TO SECOND
    • INTERVAL 'h' HOUR
    • INTERVAL 'h:m' HOUR TO MINUTE
    • INTERVAL 'm:s' MINUTE TO SECOND
    • INTERVAL 's' SECOND
  • 布爾

    布林值的結果 trueSTRING 字面值 true。 如果 false 是字串常值 falseNULL 是 NULL 字串。

  • 二元

    結果是二進位 sourceExpr 檔解譯為UTF-8字元序列。

    Azure Databricks 不會驗證 UTF-8 字元。 從 BINARY 轉換至 STRING 永遠不會插入替代字元或引發錯誤。

  • 陣列

    結果是以逗號分隔的轉換元素列表,並以方括號括住 [ ]。 每個逗號後面都會有一個空格。 項目 NULL 會轉譯為常值 null

    Azure Databricks 不會加上引號或標示單獨的元素,而這些元素本身可能包含方括號或逗號。

  • 地圖

    結果是以逗號分隔的類型鍵值對列表,並以大括弧括住 { }。 每個逗號後面都會有一個空格。 每個索引鍵值組都會以 ->分隔。 NULL 對應值會被翻譯為文字 null

    Azure Databricks 不會加上引號或標示個別的索引鍵或值,這可能本身可能包含大括弧、逗號或 ->

  • 結構

    結果是一個以逗號分隔的轉換欄位值列表,並以大括號括住 { }。 每個逗號後面都會有一個空格。 NULL欄位值會被翻譯成文字常值 null

    Azure Databricks 不會加上引號或標示個別域值,這可能本身可能包含大括弧或逗號。

  • 變體

    實際值類型 VARIANT 的型別規則適用。

範例

> SELECT cast(NULL AS STRING);
  NULL

> SELECT cast(-3Y AS STRING);
  -3

> SELECT cast(5::DECIMAL(10, 5) AS STRING);
  5.00000

> SELECT cast(12345678e-4 AS STRING);
  1234.5678

> SELECT cast(1e7 as string);
  1.0E7

> SELECT cast(1e6 as string);
  1000000.0

> SELECT cast(1e-4 as string);
  1.0E-4

> SELECT cast(1e-3 as string);
  0.001

> SELECT cast(12345678e7 AS STRING);
  1.2345678E14

> SELECT cast(DATE'1900-12-31' AS STRING);
  1900-12-31

-- Caesar no more
> SELECT cast(DATE'-0044-03-15' AS STRING);
  -0044-03-15

> SELECT cast(DATE'100000-12-31' AS STRING);
  +100000-12-31

> SELECT cast(current_timestamp() AS STRING);
  2022-04-02 22:29:09.783

> SELECT cast(TIMESTAMP_NTZ'2023-01-01' AS STRING);
  2023-01-01 00:00:00

> SELECT cast(INTERVAL -'13-02' YEAR TO MONTH AS STRING);
  INTERVAL '-13-2' YEAR TO MONTH

> SELECT cast(INTERVAL '12:04.9900' MINUTE TO SECOND AS STRING);
  INTERVAL '12:04.99' MINUTE TO SECOND

> SELECT cast(true AS STRING);
  true

> SELECT cast(false AS STRING);
  false

-- A bad UTF-8 string
> SELECT cast(x'33800033' AS STRING);
  3�3

> SELECT hex(cast(x'33800033' AS STRING));
  33800033

> SELECT cast(array('hello', NULL, 'world') AS STRING);
  [hello, null, world]

> SELECT cast(array('hello', 'wor, ld') AS STRING);
  [hello, wor, ld]

> SELECT cast(array() AS STRING);
  []

> SELECT cast(map('hello', 1, 'world', null) AS STRING);
  {hello -> 1, world -> null}

> SELECT cast(map('hello -> 1', DATE'2022-01-01') AS STRING);
  {hello -> 1 -> 2022-01-01}

> SELECT cast(map() AS STRING);
  {}

> SELECT cast(named_struct('a', 5, 'b', 6, 'c', NULL) AS STRING);
  {5, 6, null}

> SELECT cast(named_struct() AS STRING);
  {}

> SELECT cast(DATE'2024-01-05'::VARIANT AS STRING);
  2024-01-05

> SELECT cast(5 AS STRING) COLLATE UNICODE;
  5

日期

如果targetTypeDATE類型,且sourceExpr的類型為:

  • 無效

    結果是 NULLDATE

  • 字串

    sourceExpr 必須是有效的 dateString

    如果 sourceExpr 不是有效的 dateString,Azure Databricks 會傳回錯誤。

    使用 try_cast 將無效的資料錯誤轉換成 NULL

  • 時間戳

    結果是時間戳 sourceExpr的日期部分。

  • TIMESTAMP_NTZ

    結果是 timestamp_ntz sourceExpr 的日期部分。

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

範例

> SELECT cast(NULL AS DATE);
  NULL

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

> SELECT cast('1900-10-01' AS DATE);
  1900-10-01

-- There is no February 30.
> SELECT cast('1900-02-30' AS DATE);
  Error

> SELECT cast(TIMESTAMP'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14' AS DATE);
  1900-10-01

> SELECT cast(TIMESTAMP_NTZ'1900-10-01 12:13:14'::VARIANT AS DATE);
  1900-10-01

時間戳記

如果targetTypeTIMESTAMP類型,且sourceExpr的類型為:

  • 無效

    結果是 NULLDATE

  • 數值

    sourceExpr 表示從 1970-01-01 00:00:00 UTC 起的秒數。

    小於微秒的部分會被截斷。

    如果值超出的範圍 TIMESTAMP,就會引發溢位錯誤。

    使用 try_cast 將溢位錯誤轉換成 NULL

  • 字串

    sourceExpr 必須是有效的 timestampString

    如果 sourceExpr 不是有效的 timestampString,Azure Databricks 會傳回錯誤。

    使用 try_cast 將無效的資料錯誤轉換成 NULL

  • 日期

    結果是 sourceExprDATE at 00:00:00小時。

  • TIMESTAMP_NTZ

結果是一個時間戳值,其年/月/日/小時/分鐘/秒部分與 timestamp_ntz sourceExpr 相同。

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

範例

> SELECT cast(NULL AS TIMESTAMP);
  NULL

> SET TIME ZONE '+00:00';
> SELECT cast(0.0 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(0.0000009 AS TIMESTAMP);
  1970-01-01 00:00:00

> SELECT cast(1e20 AS TIMESTAMP);
  Error: overflow

> SELECT cast('1900' AS TIMESTAMP);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP);
  1900-10-01 00:00:00

> SELECT cast(TIMESTAMP_NTZ'2023-01-01 02:03:04.567' as TIMESTAMP)
  2023-01-01 02:03:04.567

> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP);
  1900-10-01 00:00:00

TIMESTAMP_NTZ

如果targetTypeTIMESTAMP_NTZ類型,且sourceExpr的類型為:

  • 無效

    結果是 NULLDATE

  • 字串

    sourceExpr 必須是有效的 timestampString

    如果 sourceExpr 不是有效的 timestampString,Azure Databricks 會傳回錯誤。

    使用 try_cast 將無效的資料錯誤轉換成 NULL

  • 日期

    結果是 sourceExpr hrs 的 00:00:00DATE。

  • 時間戳

    結果是工作階段時區中的本地時間,表示為 sourceExpr

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

範例

> SELECT cast(NULL AS TIMESTAMP_NTZ);
  NULL

> SELECT cast('1900' AS TIMESTAMP_NTZ);
  1900-01-01 00:00:00

> SELECT cast('1900-10-01 12:13:14' AS TIMESTAMP_NTZ);
  1900-10-01 12:13:14

> SELECT cast('1900-02-30 12:13:14' AS TIMESTAMP_NTZ);
  Error

> SELECT cast(DATE'1900-10-01' AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-07-01 08:43:28

> SELECT current_timezone(), CAST(TIMESTAMP'2021-7-1T8:43:28UTC+3' as TIMESTAMP_NTZ);
  America/Los_Angeles 2021-06-30 22:43:28

> SELECT cast(DATE'1900-10-01'::VARIANT AS TIMESTAMP_NTZ);
  1900-10-01 00:00:00

年-月間隔

如果targetType年-月間隔,且sourceExpr的類型為:

範例

> SELECT cast(NULL AS INTERVAL YEAR);
  NULL

> SELECT cast('1-4' AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-4' YEAR TO MONTH

> SELECT cast('1' AS INTERVAL YEAR TO MONTH);
  error

> SELECT cast(INTERVAL '1-4' YEAR TO MONTH AS INTERVAL MONTH)::STRING;
  INTERVAL '16' MONTH

> SELECT cast(14 AS INTERVAL YEAR TO MONTH)::STRING;
  INTERVAL '1-2' YEAR TO MONTH

> SELECT cast(INTERVAL '1-11' YEAR TO MONTH AS INTERVAL YEAR)::STRING;
  INTERVAL '1' YEAR

日間間隔

targetType如果是日間時間間隔,且 sourceExpr 類型為:

> SELECT cast(NULL AS INTERVAL HOUR);
  NULL

> SELECT cast('1 4:23' AS INTERVAL DAY TO MINUTE)::STRING;
  INTERVAL '1 04:23' DAY TO MINUTE

> SELECT cast('1' AS INTERVAL DAY TO MINUTE);
  error

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL MINUTE)::STRING;
  INTERVAL '1703' MINUTE

> SELECT cast(INTERVAL '1 4:23' DAY TO MINUTE AS INTERVAL HOUR)::STRING;
  INTERVAL '28' HOUR

> SELECT cast(125.3 AS INTERVAL MINUTE TO SECOND)::STRING;
  INTERVAL '2:5.3' MINUTE TO SECOND

布林

targetType如果是 BOOLEANsourceExpr 類型為:

  • 無效

    結果是 NULL 類型的 BOOLEAN

  • 數值

    如果 sourceExpr 為:

  • 字串

    如果 sourcEexpr 為 (不區分大小寫):

    • 'T', 'TRUE', 'Y', 'YES', or '1':結果為 true
    • 'F', 'FALSE', 'N', 'NO', or '0':結果為 false
    • NULL:結果為 NULL

    否則,Azure Databricks 會針對布爾值類型錯誤傳回無效的輸入語法。

    使用 try_cast 將無效的資料錯誤轉換成 NULL

  • 變體

    實際值類型 VARIANT 的型別規則適用。

範例

> SELECT cast(NULL AS BOOLEAN);
  NULL

> SELECT cast('T' AS BOOLEAN);
  true

> SELECT cast('True' AS BOOLEAN);
  true

> SELECT cast('1' AS BOOLEAN);
  true

> SELECT cast('0' AS BOOLEAN);
  false

> SELECT cast('n' AS BOOLEAN);
  false

> SELECT cast('on' AS BOOLEAN);
  error: invalid input syntax for type boolean

> SELECT cast(0 AS BOOLEAN);
  false

> SELECT cast(0.0E10 AS BOOLEAN);
  false

> SELECT cast(1 AS BOOLEAN);
  true

> SELECT cast(0.1 AS BOOLEAN);
  true

> SELECT cast('NaN'::FLOAT AS BOOLEAN);
  true

> SELECT cast(1::VARIANT AS BOOLEAN);
  true

二進制

targetType如果是 BINARY,且 sourceExpr 類型為:

  • 無效

    結果是 NULL 類型的 BINARY

  • 字串

    結果是 surceExpr 的 UTF-8 編碼。

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

範例

> SELECT cast(NULL AS BINARY);
  NULL

> SELECT hex(cast('Spark SQL' AS BINARY));
  537061726B2053514C

> SELECT hex(cast('Oдesa' AS BINARY));
  4FD0B4657361

> SELECT hex(cast('Oдesa'::VARIANT AS BINARY));
  4FD0B4657361

陣列

targetType如果 是 ARRAY < targetElementType >sourceExpr 類型為:

  • 無效

    結果是 NULLtargeType

  • 陣列 < sourceElementType >

    如果支援從 sourceElementType 轉換 targetElementType ,結果為 ARRAY<targetElementType> ,且所有元素都轉換成 targetElementType

    如果不支援轉換,或無法轉換任何元素,Azure Databricks 就會引發錯誤。

    使用 try_cast 將無效的資料或溢位錯誤轉換成 NULL

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

範例

> SELECT cast(NULL AS ARRAY<INT>);
  NULL

> SELECT cast(array('t', 'f', NULL) AS ARRAY<BOOLEAN>);
  [true, false, NULL]

> SELECT cast(array('t', 'f', NULL) AS INTERVAL YEAR);
  error: cannot cast array<string> to interval year

> SELECT cast(array('t', 'f', 'o') AS ARRAY<BOOLEAN>);
  error: invalid input syntax for type boolean: o.

> SELECT cast(array('t', 'f', NULL)::VARIANT AS ARRAY<BOOLEAN>);
  [true, false, NULL]

地圖

如果 targetTypeMAP < targetKeyType,targetValueType > 的話,且 sourceExpr 類型為:

  • 無效

    結果是 NULLtargetType

  • MAP <sourceKeyType、sourceValueType >

    如果支援從 sourceKeyType 轉換成 targetKeyTypesourceValueTypetargetValueType 的轉換,則結果是 MAP<targetKeyType, targetValueType>,所有索引鍵都轉換成 targetKeyType,而所有值都轉換成 targetValueType

    如果不支持轉換,或無法轉換任何索引鍵或值,Azure Databricks 就會引發錯誤。

    使用 try_cast 將無效的資料或溢位錯誤轉換成 NULL

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

  • OBJECT < [sourceFieldName : sourceFieldType [, ...]] >

    每種類型的 sourceFieldName 都會轉換成 STRING 並對應到一個映射鍵。 每個來源欄位的值 sourceFieldType 都會被轉換 targetValueType,並映射到相應的映射值。

    如果不支援任何轉換,或無法轉換任何域值或索引鍵值,Azure Databricks 就會引發錯誤。

    使用 try_cast 將無效的資料或溢位錯誤轉換成 NULL

範例

> SELECT cast(NULL AS MAP<STRING, INT>);
  NULL

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, BOOLEAN>);
  {10 -> true, 15 -> false, 20 -> null}

> SELECT cast(map('10', 't', '15', 'f', '20', NULL) AS MAP<INT, ARRAY<INT>>);
  error: cannot cast map<string,string> to map<int,array<int>>

> SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS MAP<INT, BOOLEAN>);
  error: invalid input syntax for type boolean: o.

-- Casting an OBJECT to a MAP
> SELECT schema_of_variant(parse_json('{"cars": 12, "bicycles": 5 }'));
  OBJECT<bicycles: BIGINT, cars: BIGINT>
> SELECT CAST(parse_json('{"cars": 12, "bicycles": 5 }') AS MAP<STRING, INTEGER>);
  {bicycles -> 5, cars -> 12}

結構

targetType是一個STRUCT <[targetFieldName : targetFieldType [NOT NULL] [COMMENT str] [, ...]]>,且sourceExpr的類型為:

  • 無效

    結果是 NULLtargetType

  • STRUCT < [sourceFieldName : sourceFieldType [NOT NULL] [COMMENT str] [, ...]] >

    sourceExpr如果這些所有條件都成立,則可以轉換成 targetType

    • 來源類型具有與目標相同的欄位數目
    • 針對所有欄位: sourceFieldTypeN 可以轉換成 targetFieldTypeN
    • 針對所有域值:來源域值 N 可以轉換成 targetFieldTypeN ,如果目標欄位 N 標示為 NOT NULL,則值不是 Null。

    sourceFieldNames、來源條件約束和來源NOT NULLCOMMENT不需要符合targetType,而且會被忽略。

    如果不支援轉換或無法轉換任一欄位,Azure Databricks 會引發錯誤。

    使用 try_cast 將無效的資料或溢位錯誤轉換成 NULL

  • 變體

    實際值所遵循的型別規則適用於 VARIANT 資料類型。

  • OBJECT < [sourceFieldName : sourceFieldType [, ...]] >

    所有 sourceFieldName 都會被配對到 sourceFieldName。 每個sourceFieldType的來源欄位值都會被轉換成為匹配的targetValueType,並映射到各自的映射值。

    targetFieldName如果 不符合 ,則域值為 NULL

    如果 sourceFieldName 不符合條件,則會忽略該欄位。

    如果不支援任何轉換,或無法轉換任何域值或索引鍵值,Azure Databricks 就會引發錯誤。

    使用 try_cast 將無效的資料或溢位錯誤轉換成 NULL

範例

> SELECT cast(NULL AS STRUCT<a:INT>);
  NULL

> SELECT cast(named_struct('a', 't', 'b', '1900-01-01') AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

> SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  error: cannot cast struct<a:string,b:date> to struct<b:boolean,c:date>

> SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT<b:BOOLEAN, c:ARRAY<INT>>);
  error: cannot cast struct<a:string,b:string> to struct<b:boolean,c:array<int>>

> SELECT cast(named_struct('a', 't', 'b', 'hello') AS STRUCT<b:BOOLEAN, c:DATE>);
  error: Cannot cast hello to DateType

> SELECT cast(named_struct('a', 't', 'b', '1900-01-01')::VARIANT AS STRUCT<b:BOOLEAN, c:DATE NOT NULL COMMENT 'Hello'>);
  {"b":true,"c":1900-01-01}

-- Casting an OBJECT to a STRUCT
> SELECT schema_of_variant(parse_json('{"name": "jason", "age": 25 }'));
  OBJECT<age: BIGINT, name: STRING>
> SELECT CAST(parse_json('{"name": "jason", "age": 25 }') AS STRUCT<id: BIGINT, name: STRING>);
  {"id":null,"name":"jason"}

變體

targetType如果是 VARIANTsourceExpr 類型為:

  • 無效

    結果是 NULL 類型的 VARIANT

  • 數值

    結果是 , VARIANT表示數值。 型別的精確度 DECIMAL 位數必須是 <= 38。

    所有整數數值都會對應至 BIGINT

    所有 DECIMAL 值都被映射到其最小的精確度和小數位數。

  • 字串

    結果是 , VARIANT表示 STRING 值。

  • 日期

    結果是 , VARIANT表示 DATE 值。

  • 時間戳

    結果是 , VARIANT表示 TIMESTAMP 值。

  • TIMESTAMP_NTZ

    結果是 , VARIANT表示 TIMESTAMP NTZ 值。

  • 布爾

    結果是 , VARIANT表示 BOOLEAN 值。

  • 二元

    結果是 , VARIANT表示 BINARY 值。

  • 陣列 < sourceElementType >

    如果支援從 sourceElementTypeVARIANT 的轉換,則結果為 VARIANT,表示 ARRAY<sourceElementType>

    如果不支持轉換,Azure Databricks 就會引發錯誤。

  • 結構

    此鑄造不直接支援,因為 VARIANT 無法保持結構欄位的順序。 使用 to_variant_objectSTRUCT 轉換 VARIANTOBJECT

  • 地圖

    此轉型不直接受支持,因為VARIANT無法保存MAP類型。 使用 to_variant_objectMAP 轉換 VARIANTOBJECT。 映射鍵必須是字串。

    如果不支持轉換,Azure Databricks 就會引發錯誤。

    使用 try_cast 將無效的資料或溢位錯誤轉換成 NULL

範例

> SELECT cast(NULL AS VARIANT);
  NULL

> SELECT cast(5.1000 AS VARIANT);
  5.1

> SELECT schema_of_variant(cast(5 AS VARIANT));
  BIGINT