LISTAGG奇怪的串联

时间:2019-01-25 16:24:40

标签: sql oracle

当我使用下面的查询来获取所需的详细信息...

SELECT
    USERNAME,
    FULLNAME,
    DEPARTMENT,
    LISTAGG(TASKNAME, ', ') WITHIN GROUP (ORDER BY TASKNAME) TASKNAME
FROM USERDB t1 LEFT JOIN
USERDB_TASKS t3 ON t1.USERID=t3.USERID LEFT JOIN
TASKS t2 ON t3.TASKSID=t2.TASKSID
GROUP BY
    USERNAME,
    FULLNAME,
    DEPARTMENT;

TASKNAME列以奇怪的格式(在SQL Developer和批处理脚本中)填充值,即每个单词的所有字符如下所示散布,而在实际表TASKS中,任务名称值/单词是正常的。

USERNAME  FULLNAME      DEPARTMENT TASKNAME
duryo     dur yogeli    IT         D o m a i n a d m i n, S e s s i o n u s e r
rected    rec tedenson  SALES      P r o c e s s m a n a g e r, D B A u s e r, F l o . . .

尽管我在脚本中使用了下面给出的必需格式设置选项,但我不明白为什么LISTAGG会发生这种奇怪的值连接以及如何解决此问题。我已经计算出表TASKS中所有可用任务名称的所有字符之和仅为130。

SET TRIMSPOOL ON
SET TRIMOUT ON
SET UNDERLINE off
set pagesize 0 embedded on
set linesize 100
column USERNAME format a15
column FULLNAME format a25
column DEPARTMENT format a15
column TASKNAME format a200

感谢您的帮助!

EDIT-1 :实际TASKS表值的DUMP每个字母后都有一个奇怪的字符。

查询的输出:

select taskname, dump(taskname, 17) as dump_test from TASKS具有所有奇怪的字符,如下所示。

Process manager Typ=1 Len=28: ^@,P,^@,r,^@,o,^@,c,^@,e,^@,s,^@,s,^@, ,^@,M,^@,a,^@,n,^@,a,^@,g,^@,e,^@,r

对此有什么解决方案吗?

1 个答案:

答案 0 :(得分:0)

只需为遇到此问题的其他人添加一些有关DUMP功能的文档。

您的问题很有趣。大家都发现,转储函数只是显示该字段是Varchar2字段,而转储函数的输出-Typ = 1则表明该列很好。我在下面粘贴了一些我已经能够记录的转储数据类型值的图像。

enter image description here

我在一个不错的代码段下面粘贴了一些示例,以提供有关使用Oracle Dump函数的示例。

SELECT 
    DUMP(to_date('15-JAN-18'),10,1,1) AS date_type
  , DUMP(123,10,1,1)   AS num_type
  , DUMP('abc',10,1,1) AS var_or_char_type
FROM dual
;

/* OUTPUT: 
 |
 | "DATE_TYPE"          "NUM_TYPE"          "VAR_OR_CHAR_TYPE"
 |--------------------|-------------------|------------------
 | "Typ=13 Len=8: 226"  "Typ=2 Len=3: 194"  "Typ=96 Len=3: 97"
*/

基本上,如果您想摆脱这些奇怪的字符,请在此字段中找到填充此数据的实体,并将其固定在源头。