我正在oracle中构建一个字符串,我从列中获取一个数字并使用LPad函数将其设为12位数字,因此它的长度现在为12。
示例:LPad(nProjectNr,12,'0')
,我得到000123856812(例如)。
现在我想将这个字符串拆分为3位数的部分,并以“\”作为前缀,这样结果将显示为\ 000 \ 123 \ 856 \ 812。
如何在select语句中存档,哪个函数可以实现此目的?
答案 0 :(得分:3)
假设12位数的字符串,regexp_replace
可能是一种方式:
** create test data **;
data have0;
year = 2016;
do i=1 to 12;
temp=i;
output;
end;
run;
data have; set have0;
temp1 = strip(put(year,best4.))||strip(put(temp,z2.));
yearmonth=intnx('month', input(put(temp1,6.), yymmn6.), 1)-1;
period=yearmonth;
format yearmonth yymmn6. period mmyys7.;
run;
** get data down to every unique combination of yearmonth and period **;
proc sort data = have out=unique(keep=yearmonth period) nodupkey;
by yearmonth period;
run;
** create a macro string dynamically using data **;
data create_macro_string; set unique;
macro_str=%nrstr("%stab_index")||"("||strip(put(yearmonth,yymmn6.))||","||strip(put(period,mmyys7.))||");";
keep yearmonth period macro_str;
run;
** put all your macros into a list **;
proc sql noprint;
select macro_str
into: macro_list separated by " "
from create_macro_string;
quit;
** call your macros **;
%put ¯o_list.;
正则表达式匹配3个字符的序列,并添加select regexp_replace('000123856812', '(.{3})', '\\\1') from dual
作为前缀
答案 1 :(得分:3)
使用TO_CHAR(number)
和正确的格式模型更容易做到这一点。假设我们使用\
作为千位分隔符....(唉,我们无法使用千位分隔符启动格式模型 - TO_CHAR
中不允许 - 所以我们仍然需要连接{{1}在左边):
另请参阅下面的编辑
\
如果没有select 123856812 as n,
'\' || to_char(123856812, 'FM000G000G000G000', 'nls_numeric_characters=.\') as str
from dual
;
N STR
--------- ----------------
123856812 \000\123\856\812
格式模型修饰符,FM
将添加一个前导空格(符号的占位符,加号或减号)。 TO_CHAR
表示“与提供的模型一致的最短可能的字符串表示” - 也就是说,在这种情况下,没有前导空格。
编辑 - 我突然意识到我们可以进一步利用FM
而不需要连接第一个TO_CHAR()
。千位分隔符\
可能不是字符串的第一个字符,但货币符号占位符G
可以!
L
答案 2 :(得分:1)
SUBSTR返回作为第一个参数传递的字符串的子字符串。您可以指定子字符串的开始位置以及应该包含的字符数。
尝试
SELECT '\'||SUBSTR('000123856812', 1,3)||'\'||SUBSTR('000123856812', 4,3)||'\'||SUBSTR('000123856812', 7,3)||'\'||SUBSTR('000123856812', 10,3) FROM dual;