適用於:
Databricks SQL
Databricks Runtime
將值 expr 轉換成目標資料類型 type。 此運算子是 (冒號冒號) 運算子的::同義字
語法
cast(sourceExpr AS targetType)
引數
-
sourceExpr:任何可轉換的表達式。 -
targetType:結果的數據類型。
退貨
結果為類型 targetType。
資料類型轉換的下列組合有效:
| 來源(欄) 目標(欄) | 無效 | 數值 | 字串 | 日期 | 時間戳 | TIMESTAMP_NTZ | 年-月間隔 | 日間時間間隔 | 布林 | 二元的 | 陣列 | 地圖 | 結構 | 變體 | 物件 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 無效 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 |
| 數值 | 否 | 是 | 是 | 否 | 是 | 否 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 是 | 否 |
| 字串 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 是 | 否 |
| 日期 | 否 | 否 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 |
| 時間戳 | 否 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 |
| TIMESTAMP_NTZ | 否 | 否 | 是 | 是 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 |
| 年-月間隔 | 否 | 是 | 是 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
| 日間時間間隔 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 |
| 布林 | 否 | 是 | 是 | 否 | 是 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 是 | 否 |
| 二元的 | 否 | 是 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 | 是 | 否 |
| 陣列 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 是 | 否 |
| 地圖 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 | 否 |
| 結構 | 否 | 否 | 是 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 否 | 否 |
| 變體 | 否 | 是 | 是 | 是 | 是 | 是 | 否 | 否 | 是 | 是 | 是 | 是 | 是 | 是 | 否 |
| 物件 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 否 | 是 | 是 | 否 | 否 |
以 targetType 為基礎的規則和限制
警告
在 Databricks Runtime 中,如果 spark.sql.ansi.enabled 為 false,則溢位不會造成錯誤,而是會「包裝」結果。
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 UTC和sourceExpr之間經過的秒數。如果
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
字串
如果 sourceExpr 是 STRING 產生的 STRING 會繼承 sourceExpr的定序。
在所有其他情況下,產生的 STRING 定序使用的是 預設定序。
若要變更定序,請新增 定序 表示式。
如果targetType是STRING類型,且sourceExpr的類型為:
-
結果是
NULL字串。 -
結果是具有選擇性減號的常值數位,除了小數點左邊的單一位數以外,沒有前置零。 如果
targetType大於DECIMAL(p, s)且s大於 0,則會新增小數點,並將尾端零補到小數位數。 -
如果絕對數字小於
10,000,000且大於或等於0.001,則結果將不使用科學記數法,並在小數點兩邊至少有一位數字。否則,Azure Databricks 會使用 mantissa,後面接著
E指數。 mantissa 具有選擇性的前置減號,後面接著小數點左邊的一位數,以及右邊大於零的最小位數。 指數可以有一個選擇性的前置減號。 -
如果年份介於 9999 BCE 和 9999 CE 之間,則結果是形式為 和
-YYYY-MM-DD的YYYY-MM-DD。在此範圍之前或之後的年份,必要的數字數會新增至年份元件,並
+用於 CE。 -
如果年份介於公元前 9999 年和公元後 9999 年之間,則結果是格式為和
-YYYY-MM-DD hh:mm:ss的YYYY-MM-DD hh:mm:ss。在此範圍之前或之後的年份,必要的數字數會新增至年份元件,並
+用於 CE。必要時會新增小數秒
.f...。 -
如果年份介於公元前 9999 年和公元後 9999 年之間,則結果是格式為和
-YYYY-MM-DD hh:mm:ss的YYYY-MM-DD hh:mm:ss。在此範圍之前或之後的年份,必要的數字數會新增至年份元件,並
+用於 CE。必要時會新增小數秒
.f...。 -
結果是區間表示式的最短形式。 如果間隔為負數,則符號會內嵌在 中
interval-string。 對於小於 10 的單位,會省略前置零。典型的年月間隔字串格式如下:
INTERVAL 'Y' YEARINTERVAL 'Y-M' YEAR TO MONTHINTERVAL 'M' MONTH
-
結果是區間表示式的最短形式。 如果間隔為負數,則符號會內嵌在 中
interval-string。 對於小於 10 的單位,會省略前置零。一般日時間間隔字串的格式如下:
INTERVAL 'D' DAYINTERVAL 'D h' DAY TO HOURINTERVAL 'D h:m' DAY TO MINUTEINTERVAL 'D h:m:s' DAY TO SECONDINTERVAL 'h' HOURINTERVAL 'h:m' HOUR TO MINUTEINTERVAL 'm:s' MINUTE TO SECONDINTERVAL 's' SECOND
-
布林值的結果
true是STRING字面值true。 如果false是字串常值false。NULL是 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
日期
如果targetType是DATE類型,且sourceExpr的類型為:
-
結果是
NULLDATE。 -
sourceExpr必須是有效的 dateString。如果
sourceExpr不是有效的dateString,Azure Databricks 會傳回錯誤。使用 try_cast 將無效的資料錯誤轉換成
NULL。 -
結果是時間戳
sourceExpr的日期部分。 -
結果是 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
時間戳記
如果targetType是TIMESTAMP類型,且sourceExpr的類型為:
-
結果是
NULLDATE。 -
sourceExpr表示從1970-01-01 00:00:00 UTC起的秒數。小於微秒的部分會被截斷。
如果值超出的範圍
TIMESTAMP,就會引發溢位錯誤。使用 try_cast 將溢位錯誤轉換成
NULL。 -
sourceExpr必須是有效的 timestampString。如果
sourceExpr不是有效的timestampString,Azure Databricks 會傳回錯誤。使用 try_cast 將無效的資料錯誤轉換成
NULL。 -
結果是
sourceExprDATEat00:00:00小時。
結果是一個時間戳值,其年/月/日/小時/分鐘/秒部分與 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
如果targetType是TIMESTAMP_NTZ類型,且sourceExpr的類型為:
-
結果是
NULLDATE。 -
sourceExpr必須是有效的 timestampString。如果
sourceExpr不是有效的timestampString,Azure Databricks 會傳回錯誤。使用 try_cast 將無效的資料錯誤轉換成
NULL。 -
結果是
sourceExprhrs 的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的類型為:
-
結果是一個
NULL年-月間隔。 -
適用於:
Databricks SQL
Databricks Runtime 11.3 LTS 和更新版本數值會解譯為 yearmonthIntervalQualifier 的
targetType較低單位數。 -
sourceExpr必須是有效的 yearMonthIntervalString。如果
sourceExpr不是有效的yearMonthIntervalString,Azure Databricks 會傳回錯誤。使用 try_cast 將無效的資料錯誤轉換成
NULL。 -
targetType如果 yearMonthIntervalQualifier 包含MONTH,則值保持不變,但會重新解釋以符合目標類型。否則,如果來源類型 yearMonthIntervalQualifier 包含
MONTH,則結果會截斷為完整年份。
範例
> 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 類型為:
-
結果是白天
NULL時間間隔。 -
適用於:
Databricks SQL
Databricks Runtime 11.3 LTS 和更新版本數值會解譯為 dayTimeIntervalQualifier 的
targetType較低單位數。 如果單位是SECOND任何分數,則會解譯為小數秒。 -
sourceExpr必須是有效的 dayTimeIntervalString。如果
sourceExpr不是有效的dayTimeIntervalString,Azure Databricks 會傳回錯誤。使用 try_cast 將無效的資料錯誤轉換成
NULL。 -
targetType如果 dayTimeIntervalQualifier 包含來源類型 dayTimeIntervalQualifier 的最小單位,則值會保持不變,但會重新解譯以符合目標類型。否則,會調整
sourceExpr間隔以適應targetType。
> 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如果是 BOOLEAN 且 sourceExpr 類型為:
-
結果是
NULL類型的BOOLEAN。 -
如果
sourceExpr為:0:結果為false。-
NULL:結果為NULL。 -
special floating point value:結果為true。
否則,結果為
true。-
-
如果
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 類型為:
範例
> 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 類型為:
-
結果是
NULL的targeType。 -
如果支援從
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]
地圖
如果 targetType 是 MAP < targetKeyType,targetValueType > 的話,且 sourceExpr 類型為:
-
結果是
NULL的targetType。 MAP <sourceKeyType、sourceValueType >
如果支援從
sourceKeyType轉換成targetKeyType和sourceValueType到targetValueType的轉換,則結果是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的類型為:
-
結果是
NULL的targetType。 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如果是 VARIANT 且 sourceExpr 類型為:
-
結果是
NULL類型的VARIANT。 -
結果是 ,
VARIANT表示數值。 型別的精確度DECIMAL位數必須是 <= 38。所有整數數值都會對應至
BIGINT。所有
DECIMAL值都被映射到其最小的精確度和小數位數。 -
結果是 ,
VARIANT表示STRING值。 -
結果是 ,
VARIANT表示DATE值。 -
結果是 ,
VARIANT表示TIMESTAMP值。 -
結果是 ,
VARIANT表示TIMESTAMP NTZ值。 -
結果是 ,
VARIANT表示BOOLEAN值。 -
結果是 ,
VARIANT表示BINARY值。 -
如果支援從
sourceElementType到VARIANT的轉換,則結果為VARIANT,表示ARRAY<sourceElementType>。如果不支持轉換,Azure Databricks 就會引發錯誤。
-
此鑄造不直接支援,因為
VARIANT無法保持結構欄位的順序。 使用 to_variant_object 將STRUCT轉換VARIANT成OBJECT。 -
此轉型不直接受支持,因為
VARIANT無法保存MAP類型。 使用 to_variant_object 將MAP轉換VARIANT成OBJECT。 映射鍵必須是字串。如果不支持轉換,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