一个listagg问题的Oracle RTRIM

时间:2017-03-10 13:06:42

标签: sql oracle

我有一个值列表,作为动态查询的一部分,形成in子句的元组。

为此,我使用了listagg,为每个值添加'),('1',',然后使用rtrim删除最后一个值:

with r1 as
    (
    select 1 as id, 'XYZ1' as r_val
    from dual
    union all
    select 2, 'ABC1'
    from dual
    )
select rtrim(listagg(r1.r_val, 
                     '''),(''1'',''') within group (order by r1.r_val),
             '''),(''1'',''' )
from r1

预期:

ABC1'),('1','XYZ1

但是,出于某种原因,如果r_val以1结尾,则1也会被修剪:

ABC1'),('1','XYZ

任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:2)

RTRIM()的字符组成一个集合,而不是单个字符串。所以每个都是单独处理的(见here)。

我不明白为什么这个查询需要RTRIM()listagg()仅将分隔符字符串放在值之间。

这应该做你想要的:

select listagg(r1.r_val, 
               '''),(''1'',''') within group (order by r1.r_val)
              )