转换函数

如果可能的话,openLooKeng 会隐式地将数字和字符值转换为正确的类型。对于任何其他类型,默认情况下,openLooKeng 不会隐式地进行转换。例如,期望返回 varchar 值的查询不会自动将 bigint 值转换为等效的 varchar 值。

必要时,可以显式地将值转换为特定的类型。

或者,您可以启用 implicit conversion 功能,然后 openLooKeng 将尝试自动应用源类型和目标类型之间的转换。

转换函数

cast(value AS type) -> type

将值显式转换为某个类型。可以使用该函数将 varchar 转换为数值类型,反之亦然。

try_cast(value AS type) -> type

cast 类似,如果转换失败,则返回 NULL。

格式化

format(format, args…) -> varchar

使用指定的格式字符串和参数返回一个格式化字符串:

  1. SELECT format('%s%%', 123); -- '123%'
  2. SELECT format('%.5f', pi()); -- '3.14159'
  3. SELECT format('%03d', 8); -- '008'
  4. SELECT format('%,.2f', 1234567.89); -- '1,234,567.89'
  5. SELECT format('%-7s,%7s', 'hello', 'world'); -- 'hello , world'
  6. SELECT format('%2$s %3$s %1$s', 'a', 'b', 'c'); -- 'b c a'
  7. SELECT format('%1$tA, %1$tB %1$te, %1$tY', date '2006-07-04'); -- 'Tuesday, July 4, 2006'

数据大小

parse_presto_data_size 函数支持以下单位:

单位说明
B字节1
kB千字节1024
MB兆字节1024^2
GB吉字节1024^3
TB太字节1024^4
PB拍字节1024^5
EB艾字节1024^6
ZB泽字节1024^7
YB尧字节1024^8

parse_presto_data_size(string) -> decimal(38)

将格式为 value unitstring 解析为一个数字,其中 valueunit 值的小数表示形式:

  1. SELECT parse_presto_data_size('1B'); -- 1
  2. SELECT parse_presto_data_size('1kB'); -- 1024
  3. SELECT parse_presto_data_size('1MB'); -- 1048576
  4. SELECT parse_presto_data_size('2.3MB'); -- 2411724

隐式转换

您可以通过设置会话属性来启用隐式转换。

  1. SET SESSION implicit_conversion=true

默认情况下,属性值为 false,此时隐式转换关闭。

如果属性值设置为 true,每当 openLooKeng 发现类型不匹配,但可能彼此兼容时,openLooKeng 就会通过应用 CAST 函数来自动重写语句。

这样,用户就无需显式地添加 CAST 函数来对类型进行转换。

例如,期望返回 varchar 值的查询会自动将 bigint 值转换为等效的 varchar 值。

很显然,并非所有的数据类型都是相互兼容的,下表列出了所有基本数据类型的所有可行转换。

BOOLEANTINYINTSMALLINTINTEGERBIGINTREALDOUBLEDECIMALVARCHARCHARVARBINARYJSONDATETIMETIME WITH TIME ZONETIMESTAMPTIMESTAMP WITH TIME ZONE
BOOLEANY(1)YYYYYYY(2)NNYNNNNN
TINYINTY(3)YYYYYYYNNYNNNNN
SMALLINTYY(4)YYYYYYNNYNNNNN
INTEGERYYYYYYYYNNYNNNNN
BIGINTYYYYYYYYNNYNNNNN
REALYYYYYYY(5)YNNYNNNNN
DOUBLEYYYYYYYYNNYNNNNN
DECIMALYYYYYYY(6)YNNYNNNNN
VARCHARY(7)YYYYYYY(8)Y(9)YYY(10)Y(11)Y(12)Y(13)Y
CHARNNNNNNNNYNNNNNNN
VARBINARYNNNNNNNNNNNNNNNN
JSONNNNNNNNNYNNNNNNN
DATENNNNNNNNYNNYNNY(14)Y
TIMENNNNNNNNYNNNNY(15)Y(16)Y
TIME WITHNNNNNNNNYNNNNYYY
TIME ZONE
TIMESTAMPNNNNNNNNYNNNYYYY
TIMESTAMPNNNNNNNNYNNNYYYY
WITH TIME
ZONE

说明:

  • Y 或 Y(#):表示支持隐式转换。但您可能需要注意一些限制。请参阅以下各项。
  • N:表示不支持隐式转换

(1)BOOLEAN -> NUMBER:转换结果只能为 0 或 1。

(2)BOOLEAN -> VARCHAR:转换结果只能为 TRUE 或 FALSE。

(3)NUMBER -> BOOLEAN:0 将转换为 false,其他值将转换为 true。

(4)BIG PRECISION -> SAMLL:当数据超出 SMALL 范围时,转换将失败。

(5)REAL/FLOAT -> DECIMAL:当数据超出 DECIMAL 范围时,转换将失败。当超出范围时,范围将被截断。

(6)DECIMAL -> DECIMAL:当数据超出 DECIMAL 范围时,转换将失败。当超出范围时,范围将被截断。

(7)VARCHAR -> BOOLEAN:只能转换“0”、“1”、“TRUE”和“FALSE”。其他值的转换会失败。

(8)VARCHAR -> DECIMAL:当数据不是数值或转换后的值超出 DECIMAL 范围时,转换将失败。当超出范围时,范围将被截断。

(9)VARCHAR -> CHAR:如果 VARCHAR 的长度大于 CHAR,它将被截断。

(10)VARCHAR -> DATE:只能将 VARCHAR 格式化为“YYYY-MM-DD”的形式,例如 2000-01-01。

(11)VARCHAR -> TIME:只能将 VARCHAR 格式化为“HH:MM:SS.XXX”的形式。

(12)VARCHAR -> TIME ZONE:只能将 VARCHAR 格式化为“HH:MM:SS.XXX XXX”的形式,例如 01:02:03.456 America/Los_Angeles

(13)VARCHAR -> TIMESTAMP:只能将 VARCHAR 格式化为“YYYY-MM-DD HH:MM:SS.XXX”的形式。

(14)DATE -> TIMESTAMP:会自动使用 0 填充时间,例如将 2010-01-01 转换为 2010-01-01 00:00:00.000。

(15)TIME -> TIME WITH TIME ZONE:会自动填充默认时区。

(16)TIME -> TIMESTAMP:会自动添加默认日期 1970-01-01。

其他

typeof(expr) -> varchar

返回所提供的表达式类型的名称:

  1. SELECT typeof(123); -- integer
  2. SELECT typeof('cat'); -- varchar(3)
  3. SELECT typeof(cos(2) + 1.5); -- double