函數

適用於:檢查標記是的磚的SQL檢查標記是的磚運行時

強製類型轉換的值expr到目標數據類型類型。這個操作符是一個同義詞::(結腸直腸癌)算子

語法

(sourceExpr作為targetType)

參數

  • sourceExpr:任何可塑的表達式。

  • targetType:結果的數據類型。

返回

結果類型targetType

以下數據類型鑄造的組合是有效的:

源(行)目標(列)

無效

數字

字符串

日期

時間戳

TIMESTAMP_NTZ

year-month間隔

白天的時間間隔

布爾

二進製

數組

地圖

結構體

無效

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

Y

數字

N

Y

Y

N

Y

N

Y

Y

Y

N

N

N

N

字符串

N

Y

Y

Y

Y

Y

Y

Y

Y

Y

N

N

N

日期

N

N

Y

Y

Y

Y

N

N

N

N

N

N

N

時間戳

N

Y

Y

Y

Y

Y

N

N

N

N

N

N

N

TIMESTAMP_NTZ

N

N

Y

Y

Y

Y

N

N

N

N

N

N

N

year-month間隔

N

Y

Y

N

N

N

Y

N

N

N

N

N

N

白天的時間間隔

N

Y

Y

N

N

N

N

Y

N

N

N

N

N

布爾

N

Y

Y

N

Y

N

N

N

Y

N

N

N

N

二進製

N

Y

Y

N

N

N

N

N

N

Y

N

N

N

數組

N

N

Y

N

N

N

N

N

N

N

Y

N

N

地圖

N

N

Y

N

N

N

N

N

N

N

N

Y

N

結構體

N

N

Y

N

N

N

N

N

N

N

N

N

Y

基於targetType規則和限製

警告

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

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

數字

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

  • 無效

    結果是一個空的指定的數值類型。

  • 數字

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

    否則,結果是sourceExpr圓形的適合的可用的規模targetType

    如果該值超出範圍targetType,一個溢出錯誤。

    使用try_cast將溢出錯誤

  • 字符串

    sourceExpr讀取一個文本值的嗎targetType

    如果sourceExpr不符合格式的文字值,一個錯誤。

    如果該值為範圍以外的targetType,一個溢出錯誤。

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

  • 時間戳

    結果是運行之間的秒數1970-01-01就是UTCsourceExpr

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

    否則,結果是<年代trong>圓形的適合的可用的規模targetType

    如果結果超出範圍targetType,一個溢出錯誤。

    使用try_cast將溢出錯誤

  • 時間間隔

    適用於:檢查標記是的磚的SQL檢查標記是的磚運行時11.2及以上

    必須是一個目標類型確切的數字

    給定一個時間間隔upper_unitlower_unit測量結果的總數lower_unit。如果lower_unit第二個分數秒存儲小數點右邊的。對於所有其他間隔結果始終是一個整數。

  • 布爾

    如果sourceExpr是:

    • 真正的:結果是0。

    • :結果是1。

    • :結果是

例子

>選擇(作為INT);>選擇(56作為INT);5>選擇(56作為小數(2,0));6>選擇(- - - - - -56作為INT);- - - - - -5>選擇(- - - - - -56作為小數(2,0));- - - - - -6>選擇(128年作為非常小的整數);溢出>選擇(128年作為小數(2,0));溢出>選擇(“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”一分鍾第二個作為小數(5,2));90年50>選擇(真正的作為INT);1>選擇(作為INT);0

字符串

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

  • 無效

    結果是一個空字符串。

  • 確切的數字

    結果是一個可選的文字數量負號,沒有前導零,除了單一數字小數點左邊的。如果targetType小數(p,s)年代更大的0,添加一個小數點和尾隨零加起來。

  • 浮點數的二進製

    如果絕對數量少10000000年大於或等於0.001,結果是沒有科學記數法表示至少有一位小數點的兩側。

    否則,磚使用一個尾數緊隨其後E和一個指數。尾數有一個可選的前置負號緊隨其後的是一位小數點左邊的,和數字的最小值大於零。指數和可選的前置負號。

  • 日期

    如果是在公元前9999年和公元9999年之間,是一個結果dateString的形式-YYYY-MM-DDYYYY-MM-DD分別。

    多年之前或之後這個範圍,必要數量的數字被添加到組件和+用於CE。

  • 時間戳

    如果是在公元前9999年和公元9999年之間,是一個結果timestampString的形式-YYYY-MM-DDhh: mm: ssYYYY-MM-DDhh: mm: ss分別。

    多年之前或之後這個範圍,必要數量的數字被添加到組件和+用於CE。

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

  • TIMESTAMP_NTZ

    如果是在公元前9999年和公元9999年之間,是一個結果timestampString的形式-YYYY-MM-DDhh: mm: ssYYYY-MM-DDhh: mm: ss分別。

    多年之前或之後這個範圍,必要數量的數字被添加到組件和+用於CE。

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

  • year-month間隔

    結果是它的最短的表示間隔文字。如果時間間隔是負的,是嵌入在跡象interval-string。對於單位小於10,前導零省略。

    一個典型的year-month間隔字符串的形式:

    • 時間間隔“Y”一年

    • 時間間隔“y m”一年

    • 時間間隔“米”

  • 白天的時間間隔

    結果是它的最短的表示間隔文字。如果時間間隔是負的,是嵌入在跡象interval-string。對於單位小於10,前導零省略。

    一個典型的一天時間間隔字符串的形式:

    • 時間間隔' D '一天

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

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

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

    • 時間間隔“h”小時

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

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

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

  • 布爾

    的結果真正的布爾是字符串真正的,因為字符串文字,對於這是空字符串。

  • 二進製

    結果是二進製sourceExpr解讀為utf - 8字符序列。

    磚不驗證utf - 8字符。一個演員二進製字符串永遠不會注入替換字符或提高一個錯誤。

  • 數組

    結果是一個逗號分隔的列表元素,這是做好方括號(]。一個空間遵循逗號。一個元素是翻譯文字

    磚不引用或馬克單個元素,這可能包含括號或逗號。

  • 地圖

    結果是一個逗號分隔的列表鍵值對,這是由花括號{}。一個空間遵循逗號。每個鍵值對由一個分隔- >。一個映射值轉換成文字

    磚不引用或馬克個人鍵或值,可能本身可能包含花括號,逗號或- >

  • 結構體

    結果是一個逗號分隔的列表字段值,這是由花括號{}。一個空間遵循逗號。一個字段值是字麵翻譯

    磚不引用的每個字段值或標誌,可能本身可能包含花括號,或者逗號。

例子

>選擇鑄造(空字符串);空>選擇鑄造(3 y作為字符串);3 >選擇演員(5::小數(10、5)字符串);5.00000 >選擇演員(12345678軍醫為字符串);1234.5678 >選擇鑄造(1 e7字符串);1.0 e7 >選擇鑄造(1 e6字符串);1000000.0 >選擇鑄造(1軍醫字符串);1.0 >選擇演員的軍醫(1 e - 3字符串);0.001 >選擇演員(12345678 e7是字符串);1.2345678 e14燈頭>選擇演員(日期“1900-12-31”作為字符串); 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); {}

日期

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

  • 無效

    結果是一個零。

  • 字符串

    sourceExpr必須是一個有效的dateString

    如果sourceExpr不是一個有效的dateString,磚返回一個錯誤。

    使用try_cast把無效的數據錯誤

  • 時間戳

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

  • TIMESTAMP_NTZ

    結果是timestamp_ntz的日期部分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>選擇(TIMESTAMP_NTZ“1900-10-01 12:13:14”作為日期);1900年- - - - - -10- - - - - -01

時間戳

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

  • 無效

    結果是一個零。

  • 數字

    sourceExpr讀取以來的秒數嗎1970-01-01就是UTC

    分數小於微秒截斷。

    如果該值的範圍之外的時間戳,一個溢出錯誤。

    使用try_cast將溢出錯誤

  • 字符串

    sourceExpr必須是一個有效的timestampString

    如果sourceExpr不是一個有效的timestampString,磚返回一個錯誤。

    使用try_cast把無效的數據錯誤

  • 日期

    結果是sourceExpr日期在就是小時。

  • TIMESTAMP_NTZ

結果是一個時間戳值相同的年/月/日/小時/分鍾/ timestamp_ntz的第二個字段sourceExpr

例子

>選擇(作為時間戳);>時間“+ 00:00”;>選擇(00作為時間戳);1970年- - - - - -01- - - - - -0100:00:00>選擇(00000009作為時間戳);1970年- - - - - -01- - - - - -0100:00:00>選擇(1e20作為時間戳);錯誤:溢出>選擇(“1900”作為時間戳);1900年- - - - - -01- - - - - -0100:00:00>選擇(“1900-10-01 12:13:14”作為時間戳);1900年- - - - - -10- - - - - -0112:13:14>選擇(“1900-02-30 12:13:14”作為時間戳);錯誤>選擇(日期“1900-10-01”作為時間戳);1900年- - - - - -10- - - - - -0100:00:00>選擇(TIMESTAMP_NTZ“2023-01-01 02:03:04.567”作為時間戳)2023年- - - - - -01- - - - - -0102:03:04567年

TIMESTAMP_NTZ

如果targetType是一個TIMESTAMP_NTZ類型sourceExpr的類型是:

  • 無效

    結果是一個零。

  • 字符串

    sourceExpr必須是一個有效的timestampString

    如果sourceExpr不是一個有效的timestampString,磚返回一個錯誤。

    使用try_cast把無效的數據錯誤

  • 日期

    結果是sourceExpr日期在就是小時。

  • 時間戳

結果是當地時間的sourceExpr在會話時區。

例子

>選擇(作為TIMESTAMP_NTZ);>選擇(“1900”作為TIMESTAMP_NTZ);1900年- - - - - -01- - - - - -0100:00:00>選擇(“1900-10-01 12:13:14”作為TIMESTAMP_NTZ);1900年- - - - - -10- - - - - -0112:13:14>選擇(“1900-02-30 12:13:14”作為TIMESTAMP_NTZ);錯誤>選擇(日期“1900-10-01”作為TIMESTAMP_NTZ);1900年- - - - - -10- - - - - -0100:00:00>選擇current_timezone(),(時間戳2021 - 7 - 1 - t8:43:28作為TIMESTAMP_NTZ);美國/Los_Angeles2021年- - - - - -07年- - - - - -0108年:43:28>選擇current_timezone(),(時間戳2021 - 7 - 1 - t8:43:28utc + 3 '作為TIMESTAMP_NTZ);美國/Los_Angeles2021年- - - - - -06- - - - - -30.22:43:28

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”小時>選擇(125年3作為時間間隔一分鍾第二個)::字符串;時間間隔“2:5.3”一分鍾第二個

布爾

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

  • 無效

    結果是一個零布爾。

  • 數字

    如果sourceExpr是:

    • 0:結果是

      否則,結果是真正的

  • 字符串

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

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

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

    • :結果是

    否則,磚返回一個無效的輸入類型邏輯錯誤的語法。

    使用try_cast把無效的數據錯誤

例子

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

二進製

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

  • 無效

    結果是一個零二進製。

  • 字符串

    結果是utf - 8編碼的surceExpr

例子

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

數組

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

  • 無效

    結果是空的targeType

  • 數組< sourceElementType >

    如果演員sourceElementTypetargetElementType支持,結果是一個數組< targetElementType >與所有元素的targetElementType

    磚提出一個錯誤如果演員不支持或如果任何元素不能投。

    使用try_cast把無效的數據或溢出錯誤

例子

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

地圖

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

  • 無效

    結果是空的targetType

  • MAP < sourceKeyType, sourceValueType >

    如果投的sourceKeyTypetargetKeyTypesourceValueTypetargetValueType支持,結果是一個MAP < targetKeyType,targetValueType >與所有鑰匙的targetKeyType和所有的值targetValueType

    磚提出一個錯誤如果演員不支持或者任何鍵或值不能投。

    使用try_cast把無效的數據或溢出錯誤

例子

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

結構體

如果targetType是一個STRUCT < [targetFieldName: targetFieldType [NOT NULL][評論str] […]] >sourceExpr的類型是:

  • 無效

    結果是空的targetType

  • STRUCT < [sourceFieldName: sourceFieldType [NOT NULL][評論str] […]] >

    sourceExpr可以投targetType如果你所有的條件是正確的:

    • 源類型具有相同數量的字段作為目標

    • 對於所有字段:sourceFieldTypeN可以投到嗎targetFieldTypeN

    • 對於所有字段值:源字段值N可以投targetFieldTypeN值不是null如果目標字段N是標記為

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

    磚提出一個錯誤如果演員不支持或者任何鍵或值不能投。

    使用try_cast把無效的數據或溢出錯誤

例子

>選擇演員(NULL作為STRUCT <答:INT >);空>選擇演員(named_struct (' a ', ' t ', ' b ', ' 1900 ')作為STRUCT < b:布爾,c:日期NOT NULL評論'你好' >);{“b”:真的,“c”: 1900-01-01} >選擇演員(named_struct (' a ', ' t ', ' b ',零::日期)作為STRUCT < b:布爾,c:日期NOT NULL評論'你好' >);錯誤:不能把結構體<字符串,b:日期> struct < b:布爾,c:日期> >選擇演員(named_struct (' a ', ' t ', ' b ', ' 1900 ')作為struct < b:布爾,c:數組< INT > >);錯誤:不能把結構體<字符串,b:字符串> struct < b:布爾,c:數組< int > > >選擇演員(named_struct (' a ', ' t ', ' b ', '你好')作為struct < b:布爾,c:日期>);錯誤:不能投喂DateType