背景
在信创适配中,从ORACLE迁移过来的程序使用了substr函数。
LightDB 23.4版本对该函数进行了增强。支持位置参数和长度参数使用number类型。
示例
使用substr(text, numeric, numeric)函数
declareline varchar(300) := '312456789009876543001000.00';acct varchar(100);amt varchar(100);pos number(10);len number(10);
beginpos = 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
DOcreate 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 | f0.00 | 0.00 | null0.00 | 0.00 | null0.00 | 2.00 | ab0.11 | 2.00 | ab0.51 | 2.00 | ab1.00 | -1.51 | null1.00 | -1.11 | null1.00 | -1.00 | null1.00 | 1.00 | a1.00 | 1.11 | a1.00 | 1.51 | a1.00 | 2.00 | ab1.00 | null | null1.11 | 2.00 | ab1.51 | 2.00 | abnull | 1.00 | nullnull | null | null
(20 rows)
如上所示,当位置信息和长度信息为浮点数时,小数部分是直接截掉后当做一个整数使用。同时当位置信息是0或者1时效果是等价的。