我需要将非常冗长的金额转换为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
请帮帮我。提前谢谢。
答案 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