全部產品
Search
文件中心

MaxCompute:CAST

更新時間:Jun 19, 2024

MaxCompute CAST是資料類型轉換函式,支援將一個運算式結果(expr)轉換成目標資料類型(type)。本文為您介紹CAST函數的命令格式、參數說明以及使用樣本。

命令格式

cast(<expr> as <type>)

參數說明

  • expr:必填。待轉換資料來源。

  • type:必填。目標資料類型。用法如下:

    • cast(double as bigint):將DOUBLE資料類型值轉換成BIGINT資料類型。

    • cast(string as bigint):在將字串轉為BIGINT資料類型時,如果字串中是以整型表達的數字,則會直接將它們轉為BIGINT類型。如果字串中是以浮點數或指數形式表達的數字,則會先轉為DOUBLE資料類型,再轉為BIGINT資料類型。

    • cast(string as datetime)cast(datetime as string):會採用預設的日期格式yyyy-mm-dd hh:mi:ss

    除此之外,cast還支援基礎資料型別 (Elementary Data Type)與JSON類型之間的相互轉換,所支援的類型包括:JSON/STRING/BIGINT/INT/TINYINT/SMALLINT/DOUBLE/FLOAT/BOOLEAN/SQL-TYPE樣本用法如下:

    • cast(json as string):將JSON運算式轉換為STRING類型。JSON運算式要求為非ARRAY和OBJECT類型。

    • cast(string as json):將STRING類型值轉換為JSON運算式,JSON運算式的類型為STRING。注意其與json_parse和json_format的區別,json_parse只支援合法的JSON STRING轉成JSON,而且可以轉成JSON OBJECT ,而cast(string as json) 可以將任意STRING轉成JSON STRING,JSON類型是STRING。

    • cast(null as json):將NULL值轉換為JSON類型。

    • cast(json 'null' as ...):json 'null'和null會轉換成sql null。

傳回值說明

  • 傳回值為轉換後的目標資料類型。

  • 如果設定了setproject odps.function.strictmode=false,則會返回字母前的數字。

  • 如果設定了setproject odps.function.strictmode=true,則會返回錯誤。

  • 當轉化成Decimal類型時,如果設定了odps.sql.decimal.tostring.trimzero=true:去掉小數點後末尾的零;如果設定了odps.sql.decimal.tostring.trimzero=false:保留小數點後末尾的零。

    重要

    目前odps.sql.decimal.tostring.trimzero參數只對錶裡取數生效,對靜態值不生效。

使用樣本

  • 樣本1:常見用法。命令樣本如下。

    --返回1。
    select cast('1' as bigint);
  • 樣本2:將STRING資料類型值轉換成BOOLEAN資料類型,當STRING為空白字串時返回false,否則返回true。命令樣本如下。

    • STRING為空白字串。

      select cast("" as boolean);
      --返回
      +------+
      | _c0  |
      +------+
      | false |
      +------+
    • STRING為非Null 字元串。

      select cast("false" as boolean);
      --返回true
      +------+
      | _c0  |
      +------+
      | true |
      +------+
  • 樣本3:將字串轉換成日期。

    --將字串轉換成日期
    select cast("2022-12-20" as date);
    --返回
    +------------+
    | _c0        |
    +------------+
    | 2022-12-20 |
    +------------+
    
    --將帶時分秒的日期文字轉成日期
    select cast("2022-12-20 00:01:01" as date);
    --返回
    +------------+
    | _c0        |
    +------------+
    | NULL       |
    +------------+
    --如果需要正常顯示,需要設定以下參數:
    set odps.sql.executionengine.enable.string.to.date.full.format= true;
    select cast("2022-12-20 00:01:01" as date);
    --返回
    +------------+
    | _c0        |
    +------------+
    | 2022-12-20 |
    +------------+
    說明

    預設參數odps.sql.executionengine.enable.string.to.date.full.format的值為false,如果需要轉換帶時分秒的日期文字,需要把該參數值設定成true

  • 樣本4(錯誤命令樣本):異常用法,如果轉換不成功或遇到不支援的類型轉換,會引發異常。錯誤命令樣本如下。

    select cast('abc' as bigint);
  • 樣本5:設定了setproject odps.function.strictmode=false的情境樣本。

    setprojectodps.function.strictmode=false;
    select cast('123abc'as bigint);
    --返回
    +------------+
    |_c0|
    +------------+
    |123|
    +------------+
  • 樣本6:設定了setproject odps.function.strictmode=true的情境樣本。

    setprojectodps.function.strictmode=true;
    select cast('123abc' as bigint);
    --返回
    FAILED:ODPS-0130071:[0,0]Semanticanalysisexception-physicalplangenerationfailed:java.lang.NumberFormatException:ODPS-0123091:Illegaltypecast-Infunctioncast,value'123abc'cannotbecastedfromStringtoBigint.
  • 樣本7:設定了odps.sql.decimal.tostring.trimzero的情境樣本。

    --建立表
    create table mf_dot (dcm1 decimal(38,18),
                         dcm2 decimal(38,18));
    --insert資料
    insert into table mf_dot values (12.45500BD,12.3400BD);
    
    --Flag為true或者不設定時
    set odps.sql.decimal.tostring.trimzero=true;
    --去掉小數點後末尾的零
    select cast(round(dcm1,3) as string),cast(round(dcm2,3) as string) from mf_dot;
    --傳回值
    +------------+------------+
    | _c0        | _c1        |
    +------------+------------+
    | 12.455     | 12.34      |
    +------------+------------+
    
    --Flag為false時
    set odps.sql.decimal.tostring.trimzero=false;
    --保留小數點後末尾的零
    select cast(round(dcm1,3) as string),cast(round(dcm2,3) as string) from mf_dot;
    --傳回值
    +------------+------------+
    | _c0        | _c1        |
    +------------+------------+
    | 12.455     | 12.340     |
    +------------+------------+
    
    --對靜態值不生效
    set odps.sql.decimal.tostring.trimzero=false;
    select cast(round(12345.120BD,3) as string);
    --返回:
    +------------+
    | _c0        |
    +------------+
    | 12345.12   |
    +------------+
  • 樣本8:STRING和JSON類型相互轉換。

    --json轉成string
    select cast(json '123' as string);
    --返回:
    +-----+
    | _c0 |
    +-----+
    | 123 |
    +-----+
    
    --json轉成string
    select cast(json '"abc"' as string);
    --返回:
    +-----+
    | _c0 |
    +-----+
    | abc |
    +-----+
    
    --json轉成string
    select cast(json 'true' as string); 
    --返回:
    +-----+
    | _c0 |
    +-----+
    | TRUE |
    +-----+
    
    --json轉成string
    select cast(json 'null' as string);
    --返回:
    +-----+
    | _c0 |
    +-----+
    | NULL |
    +-----+
    
    --string轉成json
    select cast('{"a":2}' as json); 
    --返回:
    +-----+
    | _c0 |
    +-----+
    | "{\"a\":2}" |
    +-----+
    
    
    --json轉成string的錯誤樣本,不支援array/object類型的JSON運算式轉換為string。
    select cast(json '{"a":2}' as string);
    --返回報錯:
    FAILED: ODPS-0123091:Illegal type cast - Unsupported cast from json array/object to string
  • 樣本9:NUMBER和JSON類型相互轉換。

    --json轉成bigint
    select cast(json '123' as bigint);
    --返回:
    +------------+
    | _c0        |
    +------------+
    | 123        |
    +------------+
    
    --json轉成float
    select cast(json '"1.23"' as float);
    --返回:
    +------+
    | _c0  |
    +------+
    | 1.23 |
    +------+
    
    --json轉成double
    select cast(json '1.23' as double);
    --返回:
    +------------+
    | _c0        |
    +------------+
    | 1.23       |
    +------------+
    
    --int轉成json
    select cast(123 as json);
    --返回:
    +-----+
    | _c0 |
    +-----+
    | 123 |
    +-----+
    
    --float轉成json
    select cast(1.23 as json);
    --返回:
    +-----+
    | _c0 |
    +-----+
    | 1.23 |
    +-----+
  • 樣本10:BOOLEAN和JSON類型的相互轉換。

    --boolean轉成bigint
    select cast(true as json);
    --返回:
    +-----+
    | _c0 |
    +-----+
    | true |
    +-----+
    
    --json轉成boolean
    select cast(json 'false' as boolean);
    --返回:
    +------+
    | _c0  |
    +------+
    | false |
    +------+
    
    --json轉成boolean
    select cast(json '"abc"' as boolean);
    --返回:
    +------+
    | _c0  |
    +------+
    | true |
    +------+
    
    --array/object不能轉成boolean
    select cast(json '[1,2]' as boolean);
    --返回報錯:
    Unsupported cast from json array/object to boolean
  • 樣本11:NULL和JSON類型的相互轉換。

    --null轉成string
    select json_type(cast(null as json));
    --返回:
    +-----+
    | _c0 |
    +-----+
    | NULL |
    +-----+

相關函數

CAST函數屬於複雜類型函數,更多對複雜類型資料(例如ARRAY、MAP、STRUCT、JSON資料)的處理函數請參見複雜類型函數

同時,CAST函數也屬於其他函數,更多其他業務情境的函數請參見其他函數