函數

適用於:勾選“是”磚的SQL勾選“是”磚運行時

強製轉換值expr到目標數據類型類型

語法

sourceExpr作為targetType

參數

  • sourceExpr:任何可澆注表達式。

  • targetType:結果的數據類型。

返回

結果為targetType

以下數據類型轉換的組合是有效的:

源(行)目標(列)

無效

數字

字符串

日期

時間戳

year-month間隔

白天的時間間隔

布爾

二進製

數組

地圖

結構體

無效

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

數字

N

Y

Y

N

Y

Y

Y

Y

N

N

N

N

字符串

N

Y

Y

Y

Y

Y

Y

Y

Y

N

N

N

日期

N

N

Y

Y

Y

N

N

N

N

N

N

N

時間戳

N

Y

Y

Y

Y

N

N

N

N

N

N

N

year-month間隔

N

Y

Y

N

N

Y

N

N

N

N

N

N

白天的時間間隔

N

Y

Y

N

N

N

Y

N

N

N

N

N

布爾

N

Y

Y

N

Y

N

N

Y

N

N

N

N

二進製

N

Y

Y

N

N

N

N

N

Y

N

N

N

數組

N

N

Y

N

N

N

N

N

N

Y

N

N

地圖

N

N

Y

N

N

N

N

N

N

N

Y

N

結構體

N

N

Y

N

N

N

N

N

N

N

N

Y

基於targetType的規則和限製

警告

在Databricks運行時中,如果spark.sql.ansi.enabled,溢出不會導致錯誤,而是會“包裝”結果。

一個sourceExpr值的格式無效或無效字符targetType會導致

數字

如果targetType是一個數字而且sourceExpr類型:

  • 無效

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

  • 數字

    如果targetType是一個積分數值,結果是sourceExpr截斷到一個整數。

    否則,結果是sourceExpr圓形的以適合現有的規模targetType

    的取值範圍之外targetType,將引發溢出錯誤。

    使用try_cast將溢出錯誤轉換為

  • 字符串

    sourceExpr的字麵值被讀取targetType

    如果sourceExpr不符合文字值的格式,將引發錯誤。

    參數的取值範圍之外targetType,將引發溢出錯誤。

    使用try_cast將溢出和無效的格式錯誤轉換為

  • 時間戳

    結果是間隔的秒數1970-01-0100:00:00UTC而且sourceExpr

    如果targetType是一個積分數值,結果是<年代trong>截斷到一個整數。

    否則,結果是<年代trong>圓形的以適合現有的規模targetType

    的範圍外targetType,將引發溢出錯誤。

    使用try_cast將溢出錯誤轉換為

  • 時間間隔

    適用於:勾選“是”磚的SQLSQL倉庫版本2022.35或更高版本勾選“是”Databricks Runtime 11.2及以上版本

    目標類型必須為確切的數字

    給定一個時間間隔upper_unitlower_unit結果是用總數來衡量的lower_unit.如果lower_unit第二個,小數秒存儲在小數點的右邊。對於所有其他區間,結果總是一個整數。

  • 布爾

    如果sourceExpr是:

    • 真正的:結果為0。

    • :結果為1。

    • :結果是

例子

>選擇作為INT);>選擇56作為INT);5>選擇56作為小數20));6>選擇-56作為INT);-5>選擇-56作為小數20));-6>選擇128作為非常小的整數);溢出>選擇128作為小數20));溢出>選擇“123”作為INT);123>選擇“123.0”作為INT);無效的格式>選擇時間戳“1970-01-01 00:00:01”作為);1>選擇時間戳“1970-01-01 00:00:00.000001”作為);10E-6>選擇時間戳“2022-02-01”就是作為短整型);錯誤溢出>選擇真正的作為布爾);1>選擇時間間隔“1 - 2”一年作為整數);14>選擇時間間隔“1:30.5”一分鍾第二個作為小數52));9050

字符串

如果targetType是一個字符串類型而且sourceExpr類型:

  • 無效

    結果是一個NULL字符串。

  • 確切的數字

    結果是字麵數帶有一個可選的負號,並且除了小數點左邊的個位以外沒有前導零。如果targetType小數(p,s)年代大於0則加小數點,後麵的0按比例加起來。

  • 浮點數的二進製

    如果絕對數字小於10000000年大於或等於0.001在美國,計算結果不用科學記數法表示,小數點兩邊至少有一位數字。

    否則Databricks使用尾數,後麵跟著E還有一個指數。尾數有一個可選的前導負號,後麵是小數點左邊的一位數字,右邊是大於零的最小位數。指數有一個可選的前導負號。

  • 日期

    如果年份在公元前9999年到公元9999年之間,則結果為adateString形式的-YYYY-MM-DD而且YYYY-MM-DD分別。

    對於在此範圍之前或之後的年份,將必要的位數添加到年份組件和+用於CE。

  • 時間戳

    如果年份在公元前9999年到公元9999年之間,則結果為atimestampString形式的-YYYY-MM-DDhh: mm: ss而且YYYY-MM-DDhh: mm: ss分別。

    對於在此範圍之前或之後的年份,將必要的位數添加到年份組件和+用於CE。

    分數秒.f……在必要時添加。

  • year-month間隔

    的最短表示間隔文字.如果區間為負數,則符號嵌入到interval-string.對於小於10的單位,省略前導零。

    典型的年-月間隔字符串的形式為:

    • 時間間隔“Y”一年

    • 時間間隔“y m”一年

    • 時間間隔“米”

  • 白天的時間間隔

    的最短表示間隔文字.如果區間為負數,則符號嵌入到interval-string.對於小於10的單位,省略前導零。

    典型的日時間間隔字符串形式為:

    • 時間間隔' D '一天

    • 時間間隔' Dh”一天小時

    • 時間間隔' Dh: m”一天一分鍾

    • 時間間隔' Dh: m:年代一天第二個

    • 時間間隔“h”小時

    • 時間間隔“h: m”小時一分鍾

    • 時間間隔m:年代”一分鍾第二個

    • 時間間隔“年代”第二個

  • 布爾

    的結果真正的boolean是STRING字麵量真正的,因為它是STRING字麵量,和它是NULL字符串。

  • 二進製

    結果就是二進製sourceExpr解釋為UTF-8字符序列。

    Databricks不驗證UTF-8字符。來自二進製字符串永遠不會注入替換字符或引發錯誤。

  • 數組

    結果是一個用逗號分隔的強製轉換元素列表,用方括號括起來.每個逗號後麵有一個空格。一個元素被翻譯為字麵量

    Databricks不引用或標記單個元素,這些元素本身可能包含括號或逗號。

  • 地圖

    結果是一個用逗號分隔的強製轉換鍵值對列表,其中用花括號括起來.每個逗號後麵有一個空格。每個鍵值對之間用a隔開->.一個映射值被翻譯成文字

    Databricks不引用或標記單個鍵或值,這些鍵或值本身可能包含花括號、逗號或->

  • 結構體

    結果是一個用逗號分隔的強製轉換字段值列表,用花括號括起來.每個逗號後麵有一個空格。一個字段值被轉換為字麵量

    Databricks不引用或標記單個字段值,這些字段值本身可能包含花括號或逗號。

例子

SELECT (NULL AS STRING);SELECT (-3Y AS STRING);-3 > SELECT (5::DECIMAL(10,5) AS STRING);SELECT (12345678e-4 AS STRING);> SELECT cast(1e7 as string);1.e7 > SELECT cast(1e6 as string);> SELECT cast(1 -4 as string);> SELECT cast(1e-3 as string);SELECT cast(12345678e7);1.2345678E14 > SELECT (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(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); {}

日期

如果targetType是一個日期類型而且sourceExpr類型:

  • 無效

    結果是一個NULL DATE。

  • 字符串

    sourceExpr必須是有效的dateString

    如果sourceExpr是無效的dateString, Databricks返回錯誤。

    使用try_cast將無效的數據錯誤轉換為

  • 時間戳

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

例子

>選擇作為日期);>選擇“1900-10-01”作為日期);1900-10-01>選擇“1900-10-01”作為日期);1900-10-01——沒有2月30日。>選擇“1900-02-30”作為日期);錯誤>選擇時間戳“1900-10-01 12:13:14”作為日期);1900-10-01

時間戳

如果targetType是一個時間戳類型而且sourceExpr類型:

  • 無效

    結果是一個NULL DATE。

  • 數字

    sourceExpr被讀取為秒數1970-01-0100:00:00UTC

    小於微秒的分數被截斷。

    的取值範圍之外時間戳,將引發溢出錯誤。

    使用try_cast將溢出錯誤轉換為

  • 字符串

    sourceExpr必須是有效的timestampString

    如果sourceExpr是無效的timestampString, Databricks返回錯誤。

    使用try_cast將無效的數據錯誤轉換為

  • 日期

    結果是sourceExpr日期在00:00:00小時。

例子

>選擇作為時間戳);>時間“+ 00:00”>選擇00作為時間戳);1970-01-01000000>選擇00000009作為時間戳);1970-01-01000000>選擇1e20作為時間戳);錯誤溢出>選擇“1900”作為時間戳);1900-01-01000000>選擇“1900-10-01 12:13:14”作為時間戳);1900-10-01121314>選擇“1900-02-30 12:13:14”作為時間戳);錯誤>選擇日期“1900-10-01”作為時間戳);1900-10-01000000

year-month間隔

如果targetType是一個year-month間隔而且sourceExpr類型:

例子

>選擇作為時間間隔一年);>選擇“1 - 4”作為時間間隔一年)::字符串時間間隔“1 - 4”一年>選擇' 1 '作為時間間隔一年);錯誤>選擇時間間隔“1 - 4”一年作為時間間隔)::字符串時間間隔“16”>選擇14作為時間間隔一年)::字符串時間間隔“1 - 2”一年>選擇時間間隔1 - 11的一年作為時間間隔一年)::字符串時間間隔' 1 '一年

白天的時間間隔

如果targetType是一個白天的時間間隔而且sourceExpr類型:

>選擇作為時間間隔小時);>選擇“1 23”作為時間間隔一天一分鍾)::字符串時間間隔“1 04:23”一天一分鍾>選擇' 1 '作為時間間隔一天一分鍾);錯誤>選擇時間間隔“1 23”一天一分鍾作為時間間隔一分鍾)::字符串時間間隔“1703”一分鍾>選擇時間間隔“1 23”一天一分鍾作為時間間隔小時)::字符串時間間隔“28”小時>選擇1253.作為時間間隔一分鍾第二個)::字符串時間間隔“2:5.3”一分鍾第二個

布爾

如果targetType是一個布爾而且sourceExpr類型:

  • 無效

    結果是一個NULL布爾值。

  • 數字

    如果sourceExpr是:

    • 0:結果是

      否則,結果是真正的

  • 字符串

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

    • “T”,“真正的”,“Y”,“是的”,' 1 ':結果是真正的

    • “F”,“假”,“N”,“不”,' 0 ':結果是

    • :結果是

    否則,Databricks將為類型布爾錯誤返回無效的輸入語法。

    使用try_cast將無效的數據錯誤轉換為

例子

>選擇作為布爾);>選擇“T”作為布爾);真正的>選擇“真正的”作為布爾);真正的>選擇' 1 '作為布爾);真正的>選擇' 0 '作為布爾);>選擇“n”作為布爾);>選擇“上”作為布爾);錯誤無效的輸入語法類型布爾>選擇0作為布爾);>選擇00E10汽油作為布爾);>選擇1作為布爾);真正的>選擇01作為布爾);真正的>選擇“南”::浮動作為布爾);真正的

二進製

如果targetType是一個二進製而且sourceExpr類型:

  • 無效

    結果是一個NULL二進製文件。

  • 字符串

    的UTF-8編碼surceExpr

例子

>選擇作為二進製);>選擇十六進製“火花SQL”作為二進製));537061726B2053514C>選擇十六進製Oдesa的作為二進製));4FD0B4657361

數組

如果targetType是一個數組< targetElementType >而且sourceExpr類型:

  • 無效

    的NULL值targeType

  • 數組< sourceElementType >

    如果演員從sourceElementTypetargetElementType,則結果為數組< targetElementType >將所有元素轉換為targetElementType

    如果不支持強製轉換,或者任何元素不能進行強製轉換,Databricks將拋出錯誤。

    使用try_cast將無效數據或溢出錯誤轉換為

例子

>選擇作為數組<INT>);>選擇數組“t”“f”作為數組<布爾>);真正的>選擇數組“t”“f”作為時間間隔一年);錯誤不能數組<字符串>時間間隔一年>選擇數組“t”“f”“o”作為數組<布爾>);錯誤無效的輸入語法類型布爾o

地圖

如果targetType是一個MAP < targetKeyType, targetValueType >而且sourceExpr類型:

  • 無效

    的NULL值targetType

  • MAP < sourceKeyType, sourceValueType >

    如果從sourceKeyTypetargetKeyType而且sourceValueTypetargetValueType,則結果為MAP < targetKeyType,targetValueType >所有鍵都轉換為targetKeyType和所有值轉換為targetValueType

    如果不支持強製轉換,或者任何鍵或值不能強製轉換,Databricks將拋出錯誤。

    使用try_cast將無效數據或溢出錯誤轉換為

例子

SELECT (NULL AS MAP);零>選擇演員(地圖(“10”、“t”,“15”,“f”,“20”,NULL)作為map < INT,布爾>);{10:真的,15:假的,20:零}>選擇演員(map(“10”、“t”,“15”,“f”,“20”,null)作為地圖< INT,數組< INT > >);SELECT cast(map('10', 't', '15', 'f', '20', 'o') AS map);錯誤:類型布爾:o的輸入語法無效。

結構體

如果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被標記為,則該值不為空

    sourceFieldName年代,源約束和來源評論S不需要匹配targetType被忽視。

    如果不支持強製轉換,或者任何鍵或值不能強製轉換,Databricks將拋出錯誤。

    使用try_cast將無效數據或溢出錯誤轉換為

例子

SELECT (NULL AS STRUCT);NULL > SELECT cast(named_struct('a', 't', 'b', '1900') AS STRUCT);{"b":true,"c":1900-01-01} > SELECT cast(named_struct('a', 't', 'b', NULL::DATE) AS STRUCT);error: cannot cast struct to struct > SELECT cast(named_struct('a', 't', 'b', '1900') AS struct>);SELECT cast(named_struct('a', 't', 'b', 'hello') AS struct);錯誤:不能將hello轉換為DateType