8

这是我第一次使用 LISTAGG 函数,我很困惑。我可以很容易地选择数据,但是USERS列的字符之间都有空格,并且在尝试复制粘贴时,不会复制该列中的数据。我尝试过两种不同的 IDE。难道我做错了什么?

例子:

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 结果

4

3 回答 3

9

我有类似的问题,原来问题出在编码上。我像这样解决了这个问题(如果需要,更改为另一种编码):

...listagg(convert(firstname, 'UTF8', 'AL16UTF16'), ', ')...
于 2015-03-02T14:52:17.730 回答
8

您的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*Plus 中看到的那样:

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

正如文档所说,该listagg()函数始终返回varchar2(or raw),因此传入一个nvarchar2值会导致隐式转换,从而抛出您的结果。

如果您坚持使用该数据类型的列,则可以将其转换varchar2为调用内部listagg

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现实。

于 2015-03-02T14:52:22.953 回答
4

显然这是 11 中的一个已知(未解决?)错误。 TO_CHAR() 为我工作......

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

...其中介质是有问题的列/数据类型。

于 2017-06-27T13:43:48.800 回答