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=,.'
)
然后由您的客户端或应用程序决定如何格式化该数字以供显示 - 包括将哪个字符用作小数点分隔符。
我正在处理一些数据质量问题。我想删除所有的点,最后用逗号替换点,最后把负数替换为前面。 以下是示例:
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
使用多个替换和连接
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=,.'
)
然后由您的客户端或应用程序决定如何格式化该数字以供显示 - 包括将哪个字符用作小数点分隔符。