2017-02-27 63 views
0

我有要求将非常冗长的数量转换为comma separated value in oracle。我在谷歌搜索。但我得到了一些只适用于小数字的解决方案。但不适用于冗长的数字。以下是我的解决方案。但不能正常工作。我得到############ ...如果我运行下面。在Oracle中使用逗号格式化冗长的数字

SELECT TO_CHAR(6965854565787645667634565432234565432345643265432345643242087, 
'99G999G999G9999', 'NLS_NUMERIC_CHARACTERS=",."') as test 
FROM dual; 

所需的输出:

6,965,854,565,787,645,667,634,565,432,234,565,432,345,643,265,432,345,643,242,087

请帮助我。提前致谢。

+1

这个数字来自哪里,以及数据类型是什么?如果它已经是一个字符串,你可以做到这一点,但作为数学说,它超出了Oracle允许的精度。 –

回答

1

Oracle中的数字不能超过38位有效数字。你还有更多。

如果我可以,那是什么样的“金额”?我的理解是,Oracle旨在处理真实的价值。您发布的样本号码有什么可能的含义?

新增:在注释中(如下图)原始的海报说,他与稍短一些,只有34位得到同样的错误。

两个问题。首先,格式模型必须至少具有所需的数字位数(9的数字)。 to_char(100000, '9G999')将产生输出####,因为格式模型只允许4位数字,但输入是6位数字。

然后,在更正之后,输出在前端应用程序中可能仍然看起来不正确,如SQL * Plus。在SQL * Plus中,数字列的默认宽度是10(我相信)。这可以更改为38,例如使用命令set numwidth 38。在其他前端,如Toad和SQL Developer中,默认数字宽度是可通过图形用户界面进行更改的设置。

更多加入 - 实际的to_char结果是一个字符串,并通过任何长度的默认字符串应该在任何前端被显示行,所以数值宽度可能是不相关的。 (而且,在任何情况下,它不会影响弦的显示,包括to_char()的结果。)

+1

这个数字比宇宙中的原子数量多;;) – BobC

+0

我用这个小于38位的数字来尝试。 6965854565787645667634565432234565它仍然显示相同的##### ... –

+0

@SreeBhanu - 好吧,我添加到我的初步答案。 – mathguy

1
SELECT TO_CHAR(
    6676345654322345654323456432654323456, 
    '999G999G999G999G999G999G999G999G999G999G999G999G999', 
'NLS_NUMERIC_CHARACTERS=",."') as test FROM dual 

    TEST 
    ------------------------------------------------------------ 
     6,676,345,654,322,345,654,323,456,432,654,323,456 
+0

我不确定这是否奏效。如果你真的试图使用OP给我们的号码,你会得到一个ORA-01481(无效的数字格式模型)。 –

+0

这是根据他的更新使用长度为38位的数字。 – BobC

+0

'column'命令不需要;默认情况下,SQL \ * Plus将展开以适应字符串列中最长的字符串。 – mathguy

2

请检查下面列出的查询可以提供帮助。

SELECT ltrim(regexp_replace('00' 
    || '6965854565787645667634565432234565432345643265432345643242087', '(...)', ',\1'),',|0') AS t 
FROM dual; 
+0

感谢Tajinder ..这工程.. –

1

@AlexPoole指出,也许你的输入是一个字符串。

我没有得到那种氛围;但如果实际上你的输入是一个字符串,并且如果你知道长度不超过99位,你可以做下面的事情。如果您的字符串长度可能超过99,请用下面的99替换为3的足够大的倍数(或者,您可以将其替换为计算值3 * ceil(length(str)/3))。

with 
    inputs (str) as (
     select '12345678912345' from dual 
    ) 
-- WITH clause is only for testing/illustration, not part of the solution 
select ltrim(regexp_replace(lpad(str, 99, ','), '(.{3})', ',\1'), ',') as test 
from inputs; 

TEST 
------------------ 
12,345,678,912,345 
相关问题