Oracle中的格式字符串

时间:2017-02-08 12:12:32

标签: oracle oracle11g

我正在oracle中构建一个字符串,我从列中获取一个数字并使用LPad函数将其设为12位数字,因此它的长度现在为12。 示例:LPad(nProjectNr,12,'0'),我得到000123856812(例如)。 现在我想将这个字符串拆分为3位数的部分,并以“\”作为前缀,这样结果将显示为\ 000 \ 123 \ 856 \ 812。

如何在select语句中存档,哪个函数可以实现此目的?

3 个答案:

答案 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 &macro_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;