KingbaseES 自定义操作符使用示例

本文详细介绍了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:
表示这个操作符可以支持归并连接。

posted @ 2024-07-26 11:05  KINGBASE研究院  阅读(47)  评论(0编辑  收藏  举报