declare
v_nr number DEFAULT 12345678944;
v_numberWithSpace varchar2(255);
v_count number DEFAULT 1;
begin
for i in 1..length(v_nr) loop
v_numberWithSpace := v_numberWithSpace ||substr(v_nr, v_count, 4)|| ' .';
v_count := v_count + 4;
DBMS_OUTPUT.PUT_LINE( v_numberWithSpace);
end loop;
v_numberWithSpace := substr(v_numberWithSpace,1 , length(v_numberWithSpace) -1);
end;
我想为v_numberwithSpace提供以下输出:
1234 5678 944
现在它在字符串的末尾留下了空格。 我放了一个。广告代码,使我的意思更清楚。 在开始和结束时的Whitout空间。 我尝试了this,但它对我不起作用。
答案 0 :(得分:4)
来自您链接的Ask Tom帖子的正则表达式解决方案可以进行微不足道的修改:
select trim(regexp_replace(to_char(12345678944), '(....)', '\1 ')) as result
from dual;
RESULT
-------------------------
1234 5678 944
trim()
存在,因为正则数据集的4位数的精确倍数将被正则表达式赋予尾随空格;其他价值观没有。唯一的另一个变化是使模式为四个字符而不是三个,括号内有一个额外的句点。
适用于任何大小的整数,如随机样本所示:
with t (n) as (
select trunc(dbms_random.value(power(10, level -1), power(10, level)))
from dual
connect by level <= 20
)
select n,
trim(regexp_replace(to_char(n), '(....)', '\1 ')) as result,
length(trim(regexp_replace(to_char(n), '(....)', '\1 '))) as result_length
from t;
N RESULT RESULT_LENGTH
--------------------- ------------------------- -------------
9 9 1
45 45 2
483 483 3
3178 3178 4
73389 7338 9 6
192365 1923 65 7
3662474 3662 474 8
97356484 9735 6484 9
446571637 4465 7163 7 11
9557657854 9557 6578 54 12
25608546675 2560 8546 675 13
511047589116 5110 4758 9116 14
7429787110250 7429 7871 1025 0 16
13021942429553 1302 1942 4295 53 17
563394031257243 5633 9403 1257 243 18
6504958239800949 6504 9582 3980 0949 19
84778674020192456 8477 8674 0201 9245 6 21
178163119511742275 1781 6311 9511 7422 75 22
8473846546814521167 8473 8465 4681 4521 167 23
95084346610621497023 9508 4346 6106 2149 7023 24
我刚刚显示了结果长度,因此您可以看到没有尾随空格。
答案 1 :(得分:3)
如果我理解你的需求,你必须更好地处理循环条件,不是循环起始数的所有长度,而是考虑它在4个字符组中;此外,如果你只需要一个字符串,那么PUT_LINE
就会离开循环:
declare
v_nr number DEFAULT 12345678944;
v_numberWithSpace varchar2(255);
v_count number DEFAULT 1;
begin
while v_count <= length(v_nr) loop
v_numberWithSpace := v_numberWithSpace || substr(v_nr, v_count, 4)|| ' ';
v_count := v_count + 4;
end loop;
DBMS_OUTPUT.PUT_LINE( trim(v_numberWithSpace));
end;
这将给出:
1234 5678 944