HGDB兼容Oracle隐式转换text-text

环境

系统平台: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 行记录)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值