ORACLE TO_CHAR 指定输出数据类型

ORACLE TO_CHAR SPECIFY OUTPUT DATA TYPE

我有一列数据,例如“123456789012” 我想将数据中的每 3 个字符中的每一个字符与中间的“/”分开,以便输出类似于:“123/456/789/012”

我试过 "SELECT TO_CHAR(DATA, '999/999/999/999') FROM TABLE 1" 但它没有像我一样打印输出通缉。以前我做了 "SELECT TO_CHAR(DATA, '$999,999,999,999.99') FROM TABLE 1 并且打印出来是 "$123,456,789,012.00" 所以我想我也可以对其他情况做同样的事情,但我想情况并非如此。

还有一种情况,我也想在数据前面加上'#',所以输出将是这样的:#12345678901234。我也可以使用 TO_CHAR 来解决这个问题吗?

这些可能吗?因为当我查看有关 TO_CHAR 的 oracle 文档时,它说明了一些可用于 TO_CHAR 函数的格式,而我想要的格式没有列出。

提前谢谢你。 :D

如果你想要三人一组,那么你可以使用组分隔符 G,并指定要使用的字符:

SELECT TO_CHAR(DATA, 'FM999G999G999G999', 'NLS_NUMERIC_CHARACTERS=./') FROM TABLE_1

123/456/789/012

如果您想要前导#,那么您可以使用货币指示符 L,并再次指定要使用的字符:

SELECT TO_CHAR(DATA, 'FML999999999999', 'NLS_CURRENCY=#') FROM TABLE_1

#123456789012

或两者结合:

SELECT TO_CHAR(DATA, 'FML999G999G999G999', 'NLS_CURRENCY=# NLS_NUMERIC_CHARACTERS=./') FROM TABLE_1

#123/456/789/012

db<>fiddle

数据类型始终为字符串;只是格式改变了。

这是 varchar2 数据类型的一个选项:

with test as (
                select '123456789012' a from dual
              )
select listagg(substr(a,(level-1)*3+1,3),'/') within group (order by rownum) num
from test
connect by level <=length(a)

with test as (
                select '123456789012.23' a from dual
              )
select '$'||listagg(substr((regexp_substr(a,'[0-9]{1,}')),(level-1)*3+1,3),',') within group (order by rownum)||regexp_substr(a,'[.][0-9]{1,}') num
from test
connect by level <=length(a)

输出:

第一次查询

123/456/789/012

第二次查询

3,456,789,012.23