本文详细介绍了KingbaseES中在兼容适配过程中,当遇到不支持的操作符,如何通过自定义方式解决兼容适配问题。
Kingbase自定义操作符语法和用例如下:
用例数据:
create table demo(id numeric(10,5));
insert into demo values(1.1);
insert into demo values(0);
insert into demo values(-1.1);
oracle中使用方式与kes中差异:
oracle数据库支持:
select id , id = true from demo;
ID | ID=TRUE |
---|---|
1.1 | TRUE |
0 | FALSE |
-1.1 | TRUE |
select id from demo where id = true;
ID |
---|
1.1 |
-1.1 |
select id from demo where true = id;
ID |
---|
1.1 |
-1.1 |
Kingbase数据库不支持:
test=# select id , id = true from demo;
ERROR: 操作符不存在: numeric = boolean
第1行select id , id = true from demo;
从用例可以看出,Kingbase中不支持numeric数据类型与boolean类型的数据比较。
oracle中0为false,非0数据为false。
一、Kingbase自定义操作符用例
报错:【操作符不存在: numeric = boolean】
说明不存在numeric和boolean数据类型的比较功能。
以numeric和boolean比较为例:
定义numeric_boolean(numeric, boolean)函数,参数numeric为操作符左侧数据类型;参数boolean为操作符右侧数据类型。
参照oracle数据库中两种类型的比较,对业务比较函数逻辑进行改写。
1.1 操作符比较函数
操作符比较函数1:(numeric与boolean比较):
CREATE OR REPLACE FUNCTION public.numeric_boolean(numeric, boolean)
RETURNS boolean
LANGUAGE sql
AS $function$select ($1 = 0.0) <> $2;$function$
操作符比较函数2:(boolean与numeric比较):
CREATE OR REPLACE FUNCTION public.boolean_numeric(boolean, numeric)
RETURNS boolean
LANGUAGE sql
AS $function$select ($2 = 0.0) <> $1;$function$
1.2 自定义操作符
自定义操作符定义中【以自定义操作符1为例】:
参数配置【leftarg = numeric】与numeric_boolean函数中左侧函数类型一致;
参数配置【rightarg = boolean】与numeric_boolean函数中右侧函数类型一致;
参数配置【procedure = numeric_boolea】为自定义操作符调用的numeric_boolean函数。
自定义操作符1:(numeric与boolean比较):
create operator = (
leftarg = numeric,
rightarg = boolean,
procedure = numeric_boolean
);
自定义操作符2:(boolean与numeric比较):
create operator = (
leftarg = boolean,
rightarg = numeric,
procedure = boolean_numeric
);
自定义操作符其他参数使用,请见【Kingbase自定义操作符语法】中语法说明。
二、Kingbase自定义操作符使用
test=# select id , id = true from demo;
id | ?column?
------+----------
1.1 | t
0 | f
-1.1 | t
(3 行记录)
test=# select id from demo where id = true;
id
------
1.1
-1.1
(2 行记录)
test=# select id from demo where true = id;
id
------
1.1
-1.1
(2 行记录)
注意:在Kingbase中,(numeric=boolean)与(boolean=numeric)被识别为两个操作符,需要单独定义不同的操作符。
三、Kingbase自定义操作符语法
CREATE OPERATOR name (
{FUNCTION|PROCEDURE} = function_name
[, LEFTARG = left_type ] [, RIGHTARG = right_type ]
[, COMMUTATOR = com_op ] [, NEGATOR = neg_op ]
[, RESTRICT = res_proc ] [, JOIN = join_proc ]
[, HASHES ] [, MERGES ]
)
语义:
name:
要定义的操作符的名称。允许使用的字符请见上文。名称可以被模式限定,例如CREATE OPERATOR myschema.+ (...)。如果没有被模式限定,该操作符将被创建在当前模式中。如果两个同一模式中的操作符在不同的数据类型上操作,它们可以具有相同的名称。这被称为重载。
function_name:
用来实现这个操作符的函数。
left_type:
这个操作符的左操作数(如果有)的数据类型。忽略这个选项可以表示一个左一元操作符。
right_type:
这个操作符的右操作数(如果有)的数据类型。忽略这个选项可以表示一个右一元操作符。
com_op:
这个操作符的交换子。
neg_op:
这个操作符的求反器。
res_proc:
用于这个操作符的限制选择度估计函数。
join_proc:
用于这个操作符的连接选择度估算函数。
HASHES:
表示这个操作符可以支持哈希连接。
MERGES:
表示这个操作符可以支持归并连接。