【问题标题】:Thousand separator Oracle千位分隔符 Oracle
【发布时间】:2019-02-28 13:44:45
【问题描述】:

我可以使用它来获得所需的格式:

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')

【问题讨论】:

  • 您只需要足够的 9s(和 Gs)来获得您期望处理的最长值。额外的前导无关紧要 - 除了默认情况下它们会在结果中添加空格。为什么你认为你需要 case 表达式?

标签: sql oracle


【解决方案1】:

在模型中使用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

您只需要足够的9s(和Gs)来获得您期望处理的最长值。

如果您不想要前导空格 - 包括所有这些空格中作为负值潜在减号的占位符 - 您可以添加 FM '填充模式' format model modifier:

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

【讨论】: