【问题标题】:Oracle SQL: How do I convert the substrings in a string using to_charOracle SQL:如何使用 to_char 转换字符串中的子字符串
【发布时间】:2015-09-05 19:00:34
【问题描述】:

to_char 在应用于单个匹配时可以正常工作,如下所示。

select to_char('54523234', '99,999,999,999')

我使用正则表达式仅查找字符串中货币的匹配项。但是当我将 to_char 应用于第一组时,它不起作用

SELECT regexp_replace ('24444.88, 54523234.78, and 1044.52 are numbers in this example.', 
'(([0-9]+){1,10})+\.([0-9]{2})', to_char('\1'.'99,999,999,999'))
FROM dual;

我希望输出字符串显示如下: 24,444.8854,523,234.781,044.52 在此示例中是数字。

【问题讨论】:

    标签: oracle to-char regexp-replace


    【解决方案1】:

    兄弟,这很有趣:

    SELECT regexp_replace(regexp_replace ('234234234.88, 24444.88, 54523234.78, and 1044.52 are numbers in this example.', 
    '(([0-9]{3})\.)',
    ',\1'),'(([0-9]{3}),)',',\1')
    FROM dual
    

    【讨论】:

    • 谢谢兄弟!那是完美的答案。简单而伟大!
    • 没问题,我很喜欢解决它:)
    【解决方案2】:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE OR REPLACE FUNCTION reverseString(
      str VARCHAR2
    ) RETURN VARCHAR2
    AS
      v_str VARCHAR2(4000);
    BEGIN
      FOR i IN REVERSE 1 .. LENGTH( str ) LOOP
        v_str := v_str || SUBSTR( str, i, 1 );
      END LOOP;
      RETURN v_str;
    END;
    /
    
    CREATE OR REPLACE FUNCTION insertDecimalSeparators(
      str VARCHAR2
    ) RETURN VARCHAR2
    AS
      v_str VARCHAR2(4000) := str;
      v_pos NUMBER(4,0);
      v_num VARCHAR2(4000);
      v_rpl VARCHAR2(4000);
      c_re  CONSTANT CHAR(9) := '\d+\.?\d*';
    BEGIN
      FOR i IN REVERSE 1 .. REGEXP_COUNT( str, c_re ) LOOP
        v_pos := REGEXP_INSTR( str, c_re, 1, i );
        v_num := REGEXP_SUBSTR( str, c_re, 1, i );
        v_rpl := REGEXP_REPLACE(
                   reverseString( v_num ),
                   '((\d*\.)?\d{3})',
                   '\1,',
                   1,
                   0
                 );
        IF SUBSTR( v_rpl, -1 ) = ',' THEN
          v_rpl := SUBSTR( v_rpl, 1, LENGTH( v_rpl ) - 1 );
        END IF;
        v_str := SUBSTR( v_str, 1, v_pos - 1 ) || reverseString( v_rpl ) || SUBSTR( v_str, v_pos + LENGTH( v_num ) );
      END LOOP;
      RETURN v_str;
    END;
    /
    

    查询 1

    WITH data ( str ) AS (
                SELECT '244445.88, 54523234.78, and 1044.12345678 are numbers.' FROM DUAL
      UNION ALL SELECT 'abc123456' FROM DUAL
      UNION ALL SELECT '123, 12, 1234, 123.1' FROM DUAL
      UNION ALL SELECT '123.0123456789' FROM DUAL
    )
    SELECT str,
           insertDecimalSeparators( str ) AS commaSep
    FROM   data
    

    Results

    |                                                    STR |                                                   COMMASEP |
    |--------------------------------------------------------|------------------------------------------------------------|
    | 244445.88, 54523234.78, and 1044.12345678 are numbers. | 244,445.88, 54,523,234.78, and 1,044.12345678 are numbers. |
    |                                              abc123456 |                                                 abc123,456 |
    |                                   123, 12, 1234, 123.1 |                                      123, 12, 1,234, 123.1 |
    |                                         123.0123456789 |                                             123.0123456789 |
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-28
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 2019-03-19
      • 2020-08-12
      • 2019-02-06
      相关资源
      最近更新 更多