环境
系统平台:Microsoft Windows (64-bit) 10
版本:5.6.4
文档用途
Oracle的两个文本相减,会自动转换为数值进行相减操作。
HGDB默认并不会将文本转换为数值进行相减操作。
为了实现兼容,有两种方法:
1、创建text到numeric的隐式转换。
2、创建text-text的操作符。
详细信息
可以看到text类型没有隐式转numeric
highgo=# \dC
类型转换列表
来源类型 | 目标类型 | 函数 | 隐含的?
-----------------------------+-----------------------------+--------------------+----------
"char" | character | bpchar | 在指派中
"char" | character varying | text | 在指派中
"char" | integer | int4 | 否
"char" | text | text | 是
character | "char" | char | 在指派中
character | character | bpchar | 是
character | character varying | text | 是
character | name | name | 是
character | nvarchar2 | (binary coercible) | 是
character | text | text | 是
character | varchar2 | (binary coercible) | 是
character | xml | xml | 否
character varying | "char" | char | 在指派中
character varying | character | (binary coercible) | 是
character varying | character varying | varchar | 是
character varying | name | name | 是
character varying | nvarchar2 | (binary coercible) | 是
character varying | regclass | regclass | 是
character varying | text | (binary coercible) | 是
character varying | varchar2 | (binary coercible) | 是
character varying | xml | xml | 否
nvarchar2 | bigint | (binary coercible) | 是
nvarchar2 | character | (binary coercible) | 是
nvarchar2 | character varying | (binary coercible) | 是
nvarchar2 | date | (binary coercible) | 是
nvarchar2 | double precision | (binary coercible) | 是
nvarchar2 | integer | (binary coercible) | 是
nvarchar2 | interval | (binary coercible) | 是
nvarchar2 | numeric | (binary coercible) | 是
nvarchar2 | nvarchar2 | nvarchar2 | 是
nvarchar2 | real | (binary coercible) | 是
nvarchar2 | smallint | (binary coercible) | 是
nvarchar2 | text | (binary coercible) | 是
nvarchar2 | timestamp without time zone | (binary coercible) | 是
text | "char" | char | 在指派中
text | character | (binary coercible) | 是
text | character varying | (binary coercible) | 是
text | name | name | 是
text | nvarchar2 | (binary coercible) | 是
text | regclass | regclass | 是
text | varchar2 | (binary coercible) | 是
text | xml | xml | 否
varchar2 | bigint | (binary coercible) | 是
varchar2 | character | (binary coercible) | 是
varchar2 | character varying | (binary coercible) | 是
varchar2 | date | (binary coercible) | 是
varchar2 | double precision | (binary coercible) | 是
varchar2 | integer | (binary coercible) | 是
varchar2 | interval | (binary coercible) | 是
varchar2 | numeric | (binary coercible) | 是
varchar2 | real | (binary coercible) | 是
varchar2 | smallint | (binary coercible) | 是
varchar2 | text | (binary coercible) | 是
varchar2 | timestamp without time zone | (binary coercible) | 是
varchar2 | varchar2 | varchar2 | 是
(269 行记录)
使用text-text会提示错误
highgo=# select ‘10’::text - ‘2’::text;
ERROR: 42883: operator does not exist: text - text
第1行select ‘10’::text - ‘2’::text;
^
提示: No operator matches the given name and argument type(s). You might need to add explicit type casts.
1、隐式转换方法
1.1、创建隐式转换的语法
highgo=# \h create cast
命令: CREATE CAST
描述: 建立新的类型转换
语法:
CREATE CAST (类型指派中的源数据类型 AS 类型指派中的目标数据类型)
WITH FUNCTION 函数名称 [ (参数类型 [, ...]) ]
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (类型指派中的源数据类型 AS 类型指派中的目标数据类型)
WITHOUT FUNCTION
[ AS ASSIGNMENT | AS IMPLICIT ]
CREATE CAST (类型指派中的源数据类型 AS 类型指派中的目标数据类型)
WITH INOUT
[ AS ASSIGNMENT | AS IMPLICIT ]
1.2、创建text隐式转numeric
highgo=# create cast (text as numeric) with inout AS IMPLICIT ;
CREATE CAST
1.3、现在可以text-text了
highgo=# select '10'::text - '2'::text;
?column?
----------
8
(1 行记录)
highgo=# select '10'::text - '2.8'::text;
?column?
----------
7.2
(1 行记录)
2、创建text-text操作符方法
2.1、创建运算函数
highgo=# create or replace function text_text(text,text) returns numeric as $$
highgo$# select $1::numeric-$2::numeric;
highgo$# $$ language sql strict immutable;
CREATE FUNCTION
2.2、测试运算函数
highgo=# select text_text('10.1', '20.222');
text_text
-----------
-10.122
(1 行记录)
2.3、基于运算函数,创建操作符
highgo=# create operator - (procedure=text_text, leftarg=text, rightarg=text);
CREATE OPERATOR
2.4、现在可以支持text-text了,为了验证操作符的效果,先把前面创建的隐式转换删掉
highgo=# drop cast (text as numeric);
DROP CAST
highgo=# select text_text('10.1', '20.222');
text_text
-----------
-10.122
(1 行记录)
highgo=# select text_text('10', '1.2');
text_text
-----------
8.8
(1 行记录)
1398

被折叠的 条评论
为什么被折叠?



