【问题标题】:ORA-01722: invalid number rows start with comma transfer VARCHAR2 TO_NUMBERORA-01722: 无效的数字行以逗号传输 VARCHAR2 TO_NUMBER 开头
【发布时间】:2021-01-22 03:08:39
【问题描述】:

我有以下 VARCHAR2 格式的源数据

,00100000004749745   
,100000001490116  
,125  
,200000002980232  
,25  
,439999997615814  
,5  
0  
1  
1,10000002384186  
1,5  
100  
2,1800000667572  
3   
3,29999995231628  
96  
999

将其转换为 NUMBER 的公式是什么?

如下

INSERT INTO table_b.column_b
    SELECT 
        TO_NUMBER (column_a,'9999999999D9999999999999999999999',
        'nls_numeric_characters= ''.,''') as my_numbers
    FROM table_a.column_a;

我收到一个错误

ORA-01722: 无效号码错误消息。

我认为这是因为行以逗号开头,例如 (,125)。

在目标表中我需要这样的数字格式数据

0,00100000004749745   
0,100000001490116  
0,125  
0,200000002980232  
0,25 
0,439999997615814  
0,5 
0
1
...

还尝试在逗号前面放零“0”,然后将其更改为数字

Select 
    column_a,
    TO_NUMBER (column_a,'9999D9999999999999999999999',
   'nls_numeric_characters= ''.,''')  as my_number 
from 
    (SELECT DISTINCT 
         '0'|| column_a
     FROM table_a.column_a
     WHERE column_a LIKE (',125')
    );

但结果是

0,125   125

【问题讨论】:

  • 如何将这个:,5 0 1 1,10000002384186 转换为有效数字?
  • 这是我的问题。在输出上我需要 0.5 0 1 1.10000002384186 等。这有可能吗?可能必须使用 CAST 或 TO_NUMBER 之外的其他格式。
  • 您是否尝试将,5 0 1 1,10000002384186 转换为四个单独的数字?
  • 也许你,Daniel,应该重新格式化问题并 - 对于每个输入值 - 显示所需的输出值。注意格式化;文本——事实上——很难阅读。将其作为评论发布更加困难。
  • 哦,是的,那是输入错误。我会修理它。

标签: sql oracle type-conversion oracle12c varchar2


【解决方案1】:

正如 Vasyl 所说,您的 nls_numeric_characters 需要调整。下面的查询演示了如何将字符串转换为数字。

WITH
    my_numbers (column_a)
    AS
        (SELECT ',00100000004749745' FROM DUAL
         UNION ALL
         SELECT ',100000001490116' FROM DUAL
         UNION ALL
         SELECT ',125' FROM DUAL
         UNION ALL
         SELECT ',200000002980232' FROM DUAL
         UNION ALL
         SELECT ',25' FROM DUAL
         UNION ALL
         SELECT ',439999997615814' FROM DUAL
         UNION ALL
         SELECT ',5' FROM DUAL
         UNION ALL
         SELECT '0' FROM DUAL
         UNION ALL
         SELECT '1' FROM DUAL
         UNION ALL
         SELECT '1,10000002384186' FROM DUAL
         UNION ALL
         SELECT '1,5' FROM DUAL
         UNION ALL
         SELECT '100' FROM DUAL
         UNION ALL
         SELECT '2,1800000667572' FROM DUAL
         UNION ALL
         SELECT '3' FROM DUAL
         UNION ALL
         SELECT '3,29999995231628' FROM DUAL
         UNION ALL
         SELECT '96' FROM DUAL
         UNION ALL
         SELECT '999' FROM DUAL)
SELECT n.column_a,
       TO_NUMBER (n.column_a,
                  '9999999999D9999999999999999999999999999',
                  'nls_numeric_characters= '', ''')    AS column_a_as_number
  FROM my_numbers n;

【讨论】:

    【解决方案2】:

    您似乎使用了错误的 nls_numeric_characters 值。尝试用'nls_numeric_characters='', '''替换'nls_numeric_characters=''.,'''

    说明:您的 nls_numeric_characters 将 . 定义为十进制分隔符,将 , 定义为组分隔符,但是根据您的示例,您假设十进制分隔符为 ,

    【讨论】:

    • 不,我也尝试过,但是出现“ORA-12702:SQL 函数中使用的 NLS 参数字符串无效”错误
    • 它有效,我只是没有正确复制命令。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 2023-03-15
    • 2020-05-09
    • 1970-01-01
    • 2016-09-29
    • 2014-04-14
    相关资源
    最近更新 更多