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