KingbaseES 自定義運算子使用示例

KINGBASE研究院發表於2024-07-26

本文詳細介紹了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:
表示這個運算子可以支援歸併連線。

相關文章