2013-03-08 90 views
8

我在11g數據庫上使用SQL Developer 3.1.07 當我使用listagg從字段中提取多個值時,我在結果中的每個字符之間得到一個空格listagg列。該查詢返回所有我期望看到的值,這只是多餘的空間讓我瘋狂。有什麼想法嗎?Oracle SQL Developer 3.1.07使用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 
+0

今後請發佈一個*小可重現*測試案例,而不是一大堆難以理解的代碼。除了其他任何事情之外,將問題解決到基本要求的行爲往往提供瞭解決方案,這是最好的學習方式。 – APC 2013-03-09 10:50:09

回答

13

您使用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> 
+0

這就是訣竅,我使用UTF-16 + NVARCHAR2並使用to_char做到了。非常感謝幫忙。 – 2013-03-11 14:12:36

5

這是目前已知的漏洞沒有修復:

錯誤13501087 11.2.0.3 RDBMS 11.2.0.3 SQL執行PRODID-5端口ID-226

摘要:LISTAGG RETURN奇怪的數據

*** 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