首页 > 解决方案 > 如何使用 Oracle 将此输入转换为数字

问题描述

我无法从声明为 varchar 的字段中找到正确的十进制数转换。

甲骨文 12c

消息来源说他们设置了这种格式:'S9999999999999V,99'

我使用了 TO_NUMBER() 函数,但找不到正确的转换和参数来正确读取和转换源。

只有 TO_NUMBER(field) 发送和无效号码错误。

数据接收示例

  1. +0000000000160,00
  2. -9999999999999,99

我不断收到无效号码错误。

标签: sqloracleoracle12c

解决方案


源信息格式中的 V 看起来不正确;从文档

元素 例子 描述
999V99 返回一个乘以 10n 的值(如有必要,向上取整),其中 n 是 V 之后的 9 的数量。

如果模型的其余部分是正确的,并且看起来与这两个示例匹配,那么您可能想要:

to_number(source, 'S9999999999999D99', 'NLS_NUMERIC_CHARACTERS=,.')

fmt部分与您被告知的部分相同,只是删除了 V,并用 D 标记了小数分隔符;并且该nls部分说小数分隔符是逗号。

-- CTE for sample data
with your_table (source) as (
  select '+0000000000160,00' from dual
  union all
  select '-9999999999999,99' from dual
)
-- query against sample data
select source,
  to_number(source, 'S9999999999999D99', 'NLS_NUMERIC_CHARACTERS=,.') as result
from your_table

SOURCE            RESULT
----------------- -----------------
+0000000000160,00               160
-9999999999999,99 -9999999999999.99

客户端将选择是否使用逗号或句点小数分隔符显示转换后的值,通常通过 NLS 设置。您可以更改该会话设置,或将数字显式转换回特定格式的字符串。

db<>fiddle显示默认和修改后的会话输出。


推荐阅读