千位分隔符 Oracle

5

我可以使用这个来获取所需的格式:

SELECT TO_CHAR(12345,'99G999') "Amount" FROM DUAL;
SELECT TO_CHAR(123456,'999G999') "Amount" FROM DUAL;
SELECT TO_CHAR(1234567,'9G999G999') "Amount" FROM DUAL; 

是否有一种方法可以不像这样检查长度?

select case
when length(my_number) = 5 then TO_CHAR(my_number,'99G999')
when length(my_number) = 6 then TO_CHAR(my_number,'999G999')

你只需要足够的9(和G)来处理你所期望的最长值。额外的前导1对结果没有影响 - 除非它们默认情况下会添加空格到结果中。你为什么认为你需要case表达式? - Alex Poole
1个回答

5
在模型中使用9(而不是0)意味着您不会得到前导零,因此您可以为所有这些使用相同的模型。
SELECT TO_CHAR(12345,'9G999G999') "Amount" FROM DUAL;

Amount    
----------
    12,345

SELECT TO_CHAR(123456,'9G999G999') "Amount" FROM DUAL;

Amount    
----------
   123,456

SELECT TO_CHAR(1234567,'9G999G999') "Amount" FROM DUAL; 

Amount    
----------
 1,234,567

对于预期处理的最长值,您只需要足够的9(和G)。

如果不想要前导空格 - 包括所有这些空格中用作负数占位符的那个 - 您可以添加FM'fill mode' 格式模型修饰符

SELECT TO_CHAR(12345,'FM999G999G999G999') "Amount" FROM DUAL;

Amount          
----------------
12,345

SELECT TO_CHAR(123456,'FM999G999G999G999') "Amount" FROM DUAL;

Amount          
----------------
123,456

SELECT TO_CHAR(1234567,'FM999G999G999G999') "Amount" FROM DUAL; 

Amount          
----------------
1,234,567

1
或 to_char(number,'FM999,999,999,999.09' ) - Tom Tom
@HaoHao - 这个问题使用了 G 占位符,可能是有意为之,以允许不同的会话 NLS 设置;并且似乎不需要小数。但是,是的,您可以使用任何您需要的格式,并且如果您喜欢并且适用于运行查询的所有人,则可以使用固定的逗号和句号而不是 G/D。 - Alex Poole
我想要反转,如何通过查询删除千位分隔符? - c.sankhala
1
@c.sankhala - 请提出一个新问题,包括所有必要的细节、样本数据和期望结果。请说明您是否仍需要一个字符串或实数结果(但您可以先尝试使用 to_number()to_char() 函数...)。 - Alex Poole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接