我在11g数据库上使用SQL Developer 3.1.07,当我使用listagg从字段中提取多个值时,在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的机会?例如:
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
您可以将其转换为char来解决此问题。如果这是不可接受的,则需要在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>