
# 转换函数
#### cast转换函数
HetuEngine会将数字和字符值隐式转换成正确的类型。HetuEngine不会把字符和数字类型相互转换。例如，一个查询期望得到一个varchar类型的值，HetuEngine不会自动将bigint类型的值转换为varchar类型。
如果有必要，可以将值显式转换为指定类型。
- cast(value AS type) → type 显式转换一个值的类型。可以将varchar类型的值转为数字类型，反过来转换也可以。
  ```
  select cast('186' as int );
  select cast(186 as varchar);
  ```
  

- try_cast(value AS type) → type 与cast()相似，区别是转换失败返回null。
  ```
  select try_cast(1860 as tinyint);
   _col0 
  -------
    NULL 
  (1 row)
  ```
  
![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
当出现数字溢出，null值转换等情况，会返回NULL，但无法转换的情况，还是会报错。
例如：select try_cast(186 as date);
Cannot cast integer to date
 #### Format
- format(format, args...) → varchar 描述：对一个字符串，按照格式字符串指定的方式进行格式化，并返回。
  ```
  SELECT format('%s%%',123);-- '123%'
  SELECT format('%.5f',pi());-- '3.14159'
  SELECT format('%03d',8);-- '008'
  SELECT format('%,.2f',1234567.89);-- '1,234,567.89'
  SELECT format('%-7s,%7s','hello','world');-- 'hello  ,  world'
  SELECT format('%2$s %3$s %1$s','a','b','c');-- 'b c a'
  SELECT format('%1$tA, %1$tB %1$te, %1$tY',date'2006-07-04');-- 'Tuesday, July 4, 2006
  ```
  
 
- format_number(number) → varchar 描述：返回按照单位符号格式化的字符串
  ```
  SELECT format_number(123456); -- '123K'
  SELECT format_number(1000000); -- '1M'
  ```
  
#### Data Size
parse_presto_data_size函数支持以下单位：
| 单位 | 描述         | 值       |
|:---|:---|:---|
| B  | Bytes      | 1       |
| kB | Kilobytes  | 1024    |
| MB | Megabytes  | 1024^2^ |
| GB | Gigabytes  | 1024^3^ |
| TB | Terabytes  | 1024^4^ |
| PB | Petabytes  | 1024^5^ |
| EB | Exabytes   | 1024^6^ |
| ZB | Zettabytes | 1024^7^ |
| YB | Yottabytes | 1024^8^ |
   
parse_presto_data_size(string) → decimal(38)
将带单位的格式化的值转为数字，值可以是小数，如下所示：
```
SELECT parse_presto_data_size('1B'); -- 1
SELECT parse_presto_data_size('1kB'); -- 1024
SELECT parse_presto_data_size('1MB'); -- 1048576
SELECT parse_presto_data_size('2.3MB'); -- 2411724
```
#### 其他
typeof(expr) → varchar
返回表达式的数据类型名称。
```
SELECT typeof(123);-- integer
SELECT typeof('cat');-- varchar(3)
SELECT typeof(cos(2)+1.5);-- double
```
