hetu-core/hetu-docs/zh/functions/conversion.md

9.0 KiB
Raw Permalink Blame History

转换函数

如果可能的话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

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

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'

数据大小

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 值的小数表示形式:

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

隐式转换

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

SET SESSION implicit_conversion=true

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

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

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

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

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

BOOLEAN TINYINT SMALLINT INTEGER BIGINT REAL DOUBLE DECIMAL VARCHAR CHAR VARBINARY JSON DATE TIME TIME WITH TIME ZONE TIMESTAMP TIMESTAMP WITH TIME ZONE
BOOLEAN Y(1) Y Y Y Y Y Y Y(2) N N Y N N N N N
TINYINT Y(3) Y Y Y Y Y Y Y N N Y N N N N N
SMALLINT Y Y(4) Y Y Y Y Y Y N N Y N N N N N
INTEGER Y Y Y Y Y Y Y Y N N Y N N N N N
BIGINT Y Y Y Y Y Y Y Y N N Y N N N N N
REAL Y Y Y Y Y Y Y(5) Y N N Y N N N N N
DOUBLE Y Y Y Y Y Y Y Y N N Y N N N N N
DECIMAL Y Y Y Y Y Y Y (6) Y N N Y N N N N N
VARCHAR Y(7) Y Y Y Y Y Y Y(8) Y(9) Y Y Y(10) Y(11) Y(12) Y(13) Y
CHAR N N N N N N N N Y N N N N N N N
VARBINARY N N N N N N N N N N N N N N N N
JSON N N N N N N N N Y N N N N N N N
DATE N N N N N N N N Y N N Y N N Y(14) Y
TIME N N N N N N N N Y N N N N Y(15) Y(16) Y
TIME WITH N N N N N N N N Y N N N N Y Y Y
TIME ZONE
TIMESTAMP N N N N N N N N Y N N N Y Y Y Y
TIMESTAMP N N N N N N N N Y N N N Y Y Y Y
WITH TIME
ZONE

说明:

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

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

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

(3)NUMBER -> BOOLEAN0 将转换为 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

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

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