Oracle格式聚合收集函数的字符串输出

mec1mxoz  于 7个月前  发布在  Oracle
关注(0)|答案(1)|浏览(79)

下面是我的Oracle查询-

-- User-Defined TYPE
create or replace TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000);

-- This works
select emp.DEPT_NAME,
        CAST(
            COLLECT(emp.EMP_ID || ':' || emp.EMP_JOIN_DATE) 
        AS varchar2_ntt) AS EMPS
from  employee emp 
    group by  emp.DEPT_NAME;
    
-- Output
DEPT_NAME   EMPS

SALES       TEST_DB.VARCHAR2_NTT('750127:20-JAN-23', '750228:20-JAN-23')
FINANCE     TEST_DB.VARCHAR2_NTT('548834:10-JAN-19', '802850:14-MAR-23', '802849:19-OCT-23')

字符串
这个输出我想格式化如下

输出- TEST_DB.VARCHAR2_NTT(“548834:10-JAN-19”,“802850:14-MAR-23”,“802849:19-OCT-23”)
手术后- 548834:10-JAN-19,802850:14-MAR-23,802849:19-OCT-23

我试过使用regexp_substr,但没有太大的成功。

xzlaal3s

xzlaal3s1#

varchar2_ntt是一个包含许多字符串的集合数据类型;它不是一个字符串数据类型,它是一个数组,并且它没有特定的格式。
当您使用查询时,它会显示:

TEST_DB.VARCHAR2_NTT('548834:10-JAN-19', '802850:14-MAR-23', '802849:19-OCT-23')

字符串
这是您正在使用的客户端应用程序(即SQL Developer,TOAD,Java等),以它认为您(用户)可以理解的方式显示集合数据类型。它不是由SQL语句控制的任何格式。
如果你想改变它的显示方式,你可以:
1.需要更改客户端应用程序上的首选项以更改其显示集合的方式(但是,大多数客户端应用程序没有允许您控制集合的特定格式的设置,因此您不太可能成功使用此设置)。请参阅客户端应用程序的文档。
1.不要使用集合,而使用LISTAGG,它确实返回一个字符串,您可以控制SQL语句中的格式:

SELECT dept_name,
       LISTAGG(emp_id|| ':' || emp_join_date, ',')
         WITHIN GROUP (ORDER BY emp_id, emp_join_date) AS emps
FROM   employee
GROUP BY dept_name;

相关问题