在Oracle中用逗号格式化一个冗长的数字

时间:2017-02-27 18:16:21

标签: sql database oracle oracle11g

我需要将非常冗长的金额转换为comma separated value in 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

请帮帮我。提前谢谢。

4 个答案:

答案 0 :(得分:2)

请检查以下查询是否有帮助。

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

答案 1 :(得分:1)

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

如果可以,那么"数量"就是它?我的理解是Oracle旨在处理现实生活中的价值观。您发布的样品编号有什么可能的含义?

已添加:评论中的原始海报(如下)表示他使用较短的数字(仅34位数)收到同样的错误。

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

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

更多已添加 - 实际上to_char的结果是一个字符串,默认情况下,任何长度的字符串都应在任何前端显示OK,因此数字宽度可能无关紧要。 (并且,无论如何,它不会影响字符串的显示,包括to_char()的结果。)

答案 2 :(得分: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

答案 3 :(得分: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