【问题标题】:Sum REGEXP_SUBSTR resulting ORA-01722: invalid number error求和 REGEXP_SUBSTR 结果 ORA-01722: 无效数字错误
【发布时间】:2020-09-21 19:52:14
【问题描述】:

我正在创建一个对账报告,我基本上只是想知道每个已发送批次的文档价值。

Batch ID 在自己的列中,发送的数据在一个列中,并且以逗号分隔,请参见下面随机生成的示例:

002;BATCH12345;999;TEST;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;100,00;100,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;
002;BATCH12345;999;TEST2;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;250,00;250,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;

每批最少有 2 行,最多可以有 2000 行。在此表中,我有两列:批次 ID 和数据

我需要将所有文件的金额加在一起,所以在本例中为 100 + 200。

目前我正在尝试使用此查询完成工作:

SELECT batch_id, SUM(to_number(REGEXP_SUBSTR(data, '[^;]+', 1, 16)))
FROM table
GROUP BY batch_id

但最终出现错误 ORA-01722: invalid number

在此先感谢,我非常感谢我一直从该网站获得的帮助

【问题讨论】:

    标签: sql oracle oracle11g


    【解决方案1】:

    在这里,您的数据是这样生成的:

    SQL> select REGEXP_SUBSTR('002;BATCH12345;999;TEST;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;100,00;100,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;', '[^;]+', 1, 16) from dual;
    
    REGEXP
    ------
    100,00
    
    SQL> select REGEXP_SUBSTR('002;BATCH12345;999;TEST2;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;250,00;250,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;', '[^;]+', 1, 16) from dual;
    
    REGEXP
    ------
    250,00
    
    SQL>
    

    表示, 在您的字符串中被视为十进制字符。

    让我检查一下NLS_NUMERIC_CHARACTERS = '.,' (decimal_character group_separator)

    SQL> alter session set NLS_NUMERIC_CHARACTERS = '.,';
    
    Session altered.
    
    SQL> WITH YOUR_DATA(STR) AS
      2  (
      3  SELECT '002;BATCH12345;999;TEST;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;100,00;100,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;' FROM DUAL
      4  UNION ALL
      5  SELECT '002;BATCH12345;999;TEST2;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;250,00;250,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;' FROM DUAL
      6  )
      7  select SUM(to_number(REGEXP_SUBSTR(STR, '[^;]+', 1, 16))) from YOUR_DATA;
    select SUM(to_number(REGEXP_SUBSTR(STR, '[^;]+', 1, 16))) from YOUR_DATA
                         *
    ERROR at line 7:
    ORA-01722: invalid number
    
    
    SQL>
    

    哦!我遇到了同样的错误。所以你需要使用,. 作为你的NLS_NUMERIC_CHARACTERS 参数。

    您可以在您的会话中设置它并获取正确的数据,如下所示:

    SQL> alter session set NLS_NUMERIC_CHARACTERS = ',.';
    
    Session altered.
    SQL>
    SQL> WITH YOUR_DATA(STR) AS
      2  (
      3  SELECT '002;BATCH12345;999;TEST;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;100,00;100,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;' FROM DUAL
      4  UNION ALL
      5  SELECT '002;BATCH12345;999;TEST2;123940;9999;14052020;1234;123456789;123456;;;;;;FI;;;;;;1234567;;EUR;SPOT;10000000;;250,00;250,00;;Voucher Text;;;;;;;;;;;;;15052020;E;E;E;E;' FROM DUAL
      6  )
      7  select SUM(to_number(REGEXP_SUBSTR(STR, '[^;]+', 1, 16))) from YOUR_DATA;
    
    SUM(TO_NUMBER(REGEXP_SUBSTR(STR,'[^;]+',1,16)))
    -----------------------------------------------
                                                350
    
    SQL>
    

    您可以通过oracle documentation了解更多关于NLS_NUMERIC_CHARACTERS的信息。

    要检查此NLS 参数的当前设置,您可以使用以下查询:

    SELECT *
      FROM NLS_SESSION_PARAMETERS
     WHERE PARAMETER = 'NLS_NUMERIC_CHARACTERS';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-14
      • 1970-01-01
      • 2012-09-14
      • 1970-01-01
      • 2021-10-30
      • 2021-05-03
      • 1970-01-01
      相关资源
      最近更新 更多