数据类型隐式转换规则
本文介绍POLARDB兼容Oracle数据库数据类型隐式转换规则。
- NA:表示不支持隐式类型转换,例如:
explain verbose select CAST(c1 as timestamp) from t_smallint; ERROR: cannot cast type smallint to timestamp without time zone
- e : 表示仅支持通过
CAST
或::
语法进行显示类型转换,例如:create table t_int(c1 integer); insert into t_int values(2); select CAST(c1 as boolean) from t_int; c1 ---- t insert into t_int values('true'::boolean); ERROR: column "c1" is of type integer but expression is of type boolean
- a : 表示除支持e外,还支持隐式向目标列类型赋值(通常指INSERT VALUES赋值或UPDATE SET赋值)。例如:
create table t_int(c1 integer); insert into t_int values(2); select cast(c1 as smallint) from t_int; -- ok c1 ---- 2 insert into t_int values(3::smallint); -- ok
- i : 表示除支持以上a和e外,还支持其他隐式转换,包括如表达式参数等。例如:
-- case 1 CREATE OR REPLACE FUNCTION F_VARCHAR(arg1 VarChar) RETURN void IS BEGIN dbms_output.put_line(arg1); RETURN; END; SELECT F_VARCHAR(cast('10' as INTEGER)) FROM DUAL; -- fail SELECT F_VARCHAR(cast('10' as CHAR(10))) FROM DUAL; -- ok -- case 2 create table t_varchar(c1 varchar(10)); insert into t_varchar values(2); explain verbose select sum(c1) from t_varchar; QUERY PLAN --------------------------------------------------------------------------- Aggregate (cost=43.95..43.96 rows=1 width=32) Output: sum((c1)::numeric) -> Seq Scan on public.t_varchar (cost=0.00..29.40 rows=1940 width=14) Output: c1
说明
DATE类型在POLARDB兼容Oracle数据库中实际存储类型受参数edb_redwood_date控制:
- edb_redwood_date=on(默认情况):其类型为TIMESTAMP WITHOUT TIME ZONE类型,兼容Oracle模式,隐式类型转换关系请参见图 1。
- edb_redwood_date=off:其类型为DATE类型,兼容PostgreSQL模式,除以下隐式类型转换关系外,其他情况请参见图 1。
- 当源数据类型为DATE类型目标数据类型为TIME WITHOUT TIME ZONE类型时,隐式转换为NA。
- 当源数据类型为TIMESTAMP WITHOUT TIME ZONE类型目标数据类型为DATE类型时,隐式转换为a。
- 当源数据类型为TIMESTAMP WITH TIME ZONE类型(TIMESTAMPTZ)目标数据类型为DATE类型时,隐式转换为a。
- 当源数据类型为TIMESTAMP WITHOUT TIME ZONE类型(TIMESTAMP)目标数据类型为DATE类型时,隐式转换为a。
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。
评论