2015-03-02 31 views
4

這是我第一次使用LISTAGG功能,我很困惑。我可以很容易地選擇數據,但USERS列的字符在它們之間都有空格,並且在嘗試複製粘貼時,不會複製該列中的任何數據。我嘗試過兩種不同的IDE。難道我做錯了什麼?listagg數據爲可用格式?

實施例:

select course_id, listagg(firstname, ', ') within group (order by course_id) as users 
    from (
     select distinct u.firstname, u.lastname, u.student_id, cm.course_id 
     from course_users cu 
     join users u on u.pk1 = cu.users_pk1 
     join course_main cm on cm.pk1 = cu.crsmain_pk1 
     and cm.course_id like '2015SP%' 
    ) 
group by course_id; 

收率:

LISTAGG result

+0

你能告訴我們「格式奇怪」的含義嗎?你沒有得到什麼樣的預期產出? – ruudvan 2015-03-02 14:43:59

+0

@ruudvan爲了清晰起見進行了編輯。 「USERS」列的字符在它們之間都有空格,當嘗試複製粘貼它時,不會複製該列中的任何數據。 – Cliff 2015-03-02 14:46:19

+0

子查詢返回用戶的名字沒有空格? – Aramillo 2015-03-02 14:48:56

回答

5

firstname柱似乎被定義爲nvarchar2

with t as (
    select '2015SP.BOS.PPB.556.A'as course_id, 
    cast('Alissa' as nvarchar2(10)) as firstname 
    from dual 
    union all select '2015SP.BOS.PPB.556.A'as course_id, 
    cast('Dorothea' as nvarchar2(10)) as firstname 
    from dual 
) 
select course_id, listagg(firstname, ', ') 
    within group (order by course_id) as users 
from t 
group by course_id; 

COURSE_ID   USERS       
-------------------- ------------------------------ 
2015SP.BOS.PPB.556.A 

...我不能複製/粘貼從SQL Developer中的用戶無論是價值觀,但它顯示爲空格,你可以從SQL見*加:

COURSE_ID   USERS 
-------------------- ------------------------------ 
2015SP.BOS.PPB.556.A A l i s s a, D o r o t h e a 

由於文件說,該listagg() functi總是返回varchar2(或raw),因此傳入nvarchar2值會導致隱式轉換,並將結果拋出。

如果你堅持該數據類型的塔中,你可以將它轉換爲varchar2listagg調用內部:

column users format a30 
with t as (
    select '2015SP.BOS.PPB.556.A'as course_id, 
    cast('Alissa' as nvarchar2(10)) as firstname 
    from dual 
    union all select '2015SP.BOS.PPB.556.A'as course_id, 
    cast('Dorothea' as nvarchar2(10)) as firstname 
    from dual 
) 
select course_id, listagg(cast(firstname as varchar2(10)), ', ') 
    within group (order by course_id) as users 
from t 
group by course_id; 

COURSE_ID   USERS       
-------------------- ------------------------------ 
2015SP.BOS.PPB.556.A Alissa, Dorothea    

但你可能真的不希望它是nvarchar2在所有。

6

我有類似的問題,原來,這問題是與編碼。我得到這個解決類似這樣的(如果需要切換到另一種編碼):

...listagg(convert(firstname, 'UTF8', 'AL16UTF16'), ', ')... 
+0

這樣做!謝謝! – Cliff 2015-03-02 14:56:10

+0

[正如文檔中所述,Oracle不鼓勵使用'convert'](http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions034.htm);即使這是爲了糾正已存儲在錯誤字符集中的數據。如果您在'varchar2'和'nvarchar2'存儲之間存在差異,則投射似乎更合適。如果你有更廣泛的字符集問題,那麼這可能是不安全的。取決於很多事情...... – 2015-03-02 14:59:43

+0

@AlexPoole爲什麼如此呢?文章似乎表明,這是應該使用它的時間。 – Cliff 2015-03-02 15:00:50

2

顯然,這是在11 TO_CHAR已知(未解決?)錯誤()爲我工作...

SELECT wiporderno, LISTAGG(TO_CHAR(medium), ',') WITHIN GROUP(ORDER BY wiporderno) AS jobclassification 

...其中,媒體是有問題的列/數據類型。

+0

IMO它值得添加bug#和一個簡短的描述:錯誤19461687 LISTAGG返回值包含ASCII 0x00字節的NVARCHAR沒有指定分隔符(MOS文檔ID:19461687.8)' – MaxU 2017-08-04 11:52:34