背景
在信创适配中,从ORACLE迁移过来的程序使用了substr函数。
LightDB 23.4版本对该函数进行了增强。支持位置参数和长度参数使用number类型。
示例
使用substr(text, numeric, numeric)函数
使用substr(text, numeric)函数
declare
line varchar2(300) := '312456789009876543001000.00';
acct varchar2(100);
amt varchar2(100);
pos number(10);
len number(10);
begin
pos = 1;
len = 20;
acct := substr(line, pos, len);
pos = 21;
amt := substr(line, pos);
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);
insert into tt_substr values(1.0, 1);
insert into tt_substr values(2.0, 1);
insert into tt_substr values(3.0, 1);
insert into tt_substr values(4.0, 1);
lightdb@test_oracle=# select pos, len, substr('abcdef', pos, len) v1 , substr('abcdef', pos) v2 from tt_substr order by pos ASC, len asc;
pos | len | v1 | v2
-------+-------+----+--------
-1.51 | 2.00 | f | f
-1.11 | 2.00 | f | f
-1.00 | 2.00 | f | f
0.00 | 0.00 | | abcdef
0.00 | 0.00 | | abcdef
0.00 | 2.00 | ab | abcdef
0.11 | 2.00 | ab | abcdef
0.51 | 2.00 | ab | abcdef
1.00 | -1.51 | | abcdef
1.00 | -1.11 | | abcdef
1.00 | -1.00 | | abcdef
1.00 | 1.00 | a | abcdef
1.00 | 1.00 | a | abcdef
1.00 | 1.11 | a | abcdef
1.00 | 1.51 | a | abcdef
1.00 | 2.00 | ab | abcdef
1.00 | | | abcdef
1.11 | 2.00 | ab | abcdef
1.51 | 2.00 | ab | abcdef
2.00 | 1.00 | b | bcdef
3.00 | 1.00 | c | cdef
4.00 | 1.00 | d | def
| 1.00 | |
| | |
(24 rows)
如上所示,当位置信息和长度信息为浮点数时,小数部分是直接截掉后当做一个整数使用。同时当位置信息是0或者1时效果是等价的。