ORA 01722:处理无效号码

ORA 01722 : Dealing with invalid number

我正在处理一些数据质量问题。我想删除所有的点,最后用逗号替换点,最后把负数替换为前面。 以下是示例:

70.693.271.273,20- 转换为 -70693271273,20 1.312.871.286.870- 转换为 -1312871286,870

对于第一种情况 70.693.271.273,20- 我使用以下语法得到结果 -70693271273,20

CASE WHEN REGEXP_COUNT("/BIC/ISMVALUE", '\.') >= 1
AND REGEXP_COUNT("/BIC/ISMVALUE", ',') = 1 THEN
to_number(REPLACE(TRIM(BOTH '-' FROM TRIM("/BIC/ISMVALUE")), '.', '') * (-1))
ELSE TO_NUMBER(TRIM("/BIC/ISMVALUE")) END oprl_value

同样,我想为案例 2 获得相同格式的结果。 你能帮忙解决第二个案例 1.312.871.286.870- 吗? 谢谢

使用多个替换和连接

SELECT '-' || REPLACE(REPLACE(TRIM(your_value),'.',','),'-','') AS oprl_value

您可以在 to_number() 调用中指定组和小数点分隔符。如果数字总是负数,那么您也可以将其包括在内:

to_number(
    "/BIC/ISMVALUE", 
    '999G999G999G999G999D99MI',
    'NLS_NUMERIC_CHARACTERS=,.'
  )

如果您混合使用正数和负数,则 MI 元素将导致错误;如果正数后面有 +,那么您可以使用 S 而不是 MI,但这似乎不太可能。因此,您可以通过 case 表达式单独处理否定性,并在转换过程中去除减号:

case when substr("/BIC/ISMVALUE", -1) = '-' then -1 else 1 end
*
to_number(
    rtrim("/BIC/ISMVALUE", '-'),
    '999G999G999G999G999D99',
    'NLS_NUMERIC_CHARACTERS=,.'
  )

db<>fiddle

然后由您的客户端或应用程序决定如何格式化该数字以供显示 - 包括将哪个字符用作小数点分隔符。