lightdb substr函数支持浮点类型
背景
在信创适配中,从ORACLE迁移过来的程序使用了substr函数。
LightDB 23.4版本对该函数进行了增强。支持位置参数和长度参数使用number类型。
示例
使用substr(text, numeric, numeric)函数
declare
line varchar(300) := '312456789009876543001000.00';
acct varchar(100);
amt varchar(100);
pos number(10);
len number(10);
begin
pos = 1;
len = 20;
acct := substr(line, pos, len);
pos = 21;
len = 7;
amt := substr(line, pos, len);
dbms_output.put_line('acct:' || acct);
dbms_output.put_line('amt:' || amt);
end;
/
acct:31245678900987654300
amt:1000.00
DO
create table tt_substr(pos number(10, 2), len number(10, 2));
insert into tt_substr values(0.0, 0.0);
insert into tt_substr values(-0.0, -0.0);
insert into tt_substr values(0.0, 2);
insert into tt_substr values(0.11, 2);
insert into tt_substr values(0.51, 2);
insert into tt_substr values(1.0, 2);
insert into tt_substr values(1.11, 2);
insert into tt_substr values(1.51, 2);
insert into tt_substr values(-1.0, 2);
insert into tt_substr values(-1.11, 2);
insert into tt_substr values(-1.51, 2);
insert into tt_substr values(null, null);
insert into tt_substr values(1.0, null);
insert into tt_substr values(null, 1.0);
insert into tt_substr values(1.0, 1.0);
insert into tt_substr values(1.0, 1.11);
insert into tt_substr values(1.0, 1.51);
insert into tt_substr values(1.0, -1.0);
insert into tt_substr values(1.0, -1.11);
insert into tt_substr values(1.0, -1.51);
lightdb@test_oracle=# select pos, len, substr('abcedf', pos, len) from tt_substr order by pos ASC, len asc;
pos | len | substr
-------+-------+--------
-1.51 | 2.00 | f
-1.11 | 2.00 | f
-1.00 | 2.00 | f
0.00 | 0.00 | null
0.00 | 0.00 | null
0.00 | 2.00 | ab
0.11 | 2.00 | ab
0.51 | 2.00 | ab
1.00 | -1.51 | null
1.00 | -1.11 | null
1.00 | -1.00 | null
1.00 | 1.00 | a
1.00 | 1.11 | a
1.00 | 1.51 | a
1.00 | 2.00 | ab
1.00 | null | null
1.11 | 2.00 | ab
1.51 | 2.00 | ab
null | 1.00 | null
null | null | null
(20 rows)
如上所示,当位置信息和长度信息为浮点数时,小数部分是直接截掉后当做一个整数使用。同时当位置信息是0或者1时效果是等价的。