Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL Developer 3.1.07使用Listag在字符之间添加空格_Sql_Oracle_Oracle11g - Fatal编程技术网

Oracle SQL Developer 3.1.07使用Listag在字符之间添加空格

Oracle SQL Developer 3.1.07使用Listag在字符之间添加空格,sql,oracle,oracle11g,Sql,Oracle,Oracle11g,我正在11g数据库上使用SQL Developer 3.1.07 当我使用listag从一个字段中提取多个值时,我会在listagg列的结果中的每个字符之间获得一个空格。该查询返回我期望看到的所有值,只是额外的空间让我发疯。有什么想法吗 下面是我使用过的一个查询,但每次我在查询中使用listagg时都会发生这种情况: select a.personnum Emp_ID , a.personfullname Name , a.companyhiredtm Hire_Date

我正在11g数据库上使用SQL Developer 3.1.07 当我使用listag从一个字段中提取多个值时,我会在listagg列的结果中的每个字符之间获得一个空格。该查询返回我期望看到的所有值,只是额外的空间让我发疯。有什么想法吗

下面是我使用过的一个查询,但每次我在查询中使用listagg时都会发生这种情况:

select a.personnum Emp_ID
      , a.personfullname Name
      , a.companyhiredtm Hire_Date
      , a.employmentstatus Status
      , a.employmentstatusdt Status_Date
      , h.Supervisor, h.Agency 
from vp_employeev42 a
  left outer join (select f.personid
                           , listagg (g.personcstmdatatxt, ',') within group  
                              (order by g.customdatadefid) Supervisor 
                    from vp_employeev42 f
                    left outer join personcstmdata g 
                        on f.personid = g.personid
                     where f.personnum like 'T%' 
                     and f.homelaborlevelnm3 = '1872'
                     and (g.customdatadefid = '1' 
                             or g.personcstmdatatxt is null)
                     group by f.personid) h
          on a.personid = h.personid
  left outer join (select f.personid
                      , listagg (g.personcstmdatatxt, ',') 
                              within group (order by g.customdatadefid) Agency
                   from vp_employeev42 f
                     left outer join personcstmdata g 
                           on f.personid = g.personid
                    where f.personnum like 'T%' 
                    and homelaborlevelnm3 = '1872' 
                    and (g.customdatadefid = '3' 
                              or g.personcstmdatatxt is null)
                      group by f.personid) h 
      on a.personid = h.personid   
where personnum like 'T%' 
and homelaborlevelnm3 = '1872' 
order by personnum;
以下是我得到的结果:

EMP_ID,NAME,HIRE_DATE,STATUS,STATUS_DATE,SUPERVISOR,AGENCY
T98999,Lxxxxm, Lxxxn,20-SEP-12,Active,20-SEP-12,, S t a f f m a r k

T98989,Fxxxxn, Dxxxxa,10-DEC-12,Active,10-DEC-12,, S t a f f m a r k

T99989,Hxxxs, Cxxxxxa,02-OCT-12,Active,02-OCT-12,, S t a f f m a r k
T99999,Hxxxs, Dxxxn,30-JAN-12,Terminated,21-MAY-12, C x x x x x x x x x r   T x x x x r, P R O L O G I S T I X

您是否碰巧使用了
UTF-16
+
NVARCHAR2
?例如:

SQL> select * from nls_database_parameters where parameter='NLS_NCHAR_CHARACTERSET';

PARAMETER                      VALUE
------------------------------ ----------------------------------------
NLS_NCHAR_CHARACTERSET         AL16UTF16

SQL> drop table test;

Table dropped.

SQL> create table test(a nvarchar2(10));

Table created.

SQL> insert into test values ('test');

1 row created.

SQL> insert into test values ('test 2');

1 row created.

SQL> select listagg(a, ',') within group (order by 1) from test group by 1;

LISTAGG(A,',')WITHINGROUP(ORDERBY1)
--------------------------------------------------------------------------------
 t e s t, t e s t   2
你可以用一个字符来绕过这个问题。如果这是不可接受的,您需要向Oracle支持部门提出问题

SQL> select listagg(to_char(a),',') within group (order by 1) from test group by 1;

LISTAGG(TO_CHAR(A),',')WITHINGROUP(ORDERBY1)
--------------------------------------------------------------------------------
test,test 2

SQL>

这是目前已知的错误,没有修复:

错误13501087 11.2.0.3 RDBMS 11.2.0.3 SQL执行PRODID-5 PORTID-226

摘要:Listag返回奇怪的数据

*** 12/14/11 05:12 am *** (ADD: Impact/Symptom->WRONG RESULTS )

  SubComponent: SQL Analytics
  ===========================
  DETAILED PROBLEM DESCRIPTION
  ============================
  When using LISTAGG function  with NVARCHAR , data is returned with spaces
  between characters

在Oracle 12c上,我遇到了有关
listag
函数的问题。我曾经
ASCIISTR()
要绕过它:

SELECT LISTAGG(TRIM(ASCIISTR(NVL(Name,''))), ';') 
WITHIN GROUP (ORDER BY NAME) AS Names 

在这里工作很好。

以后请发布一个小的可重复的测试用例,而不是一大块难以理解的代码。除此之外,将问题归结为本质的做法通常会提供解决方案,这是最好的学习方法。这就是诀窍,我使用UTF-16+NVARCHAR2并使用来完成它。非常感谢你的帮助。