我有一个值列表,作为动态查询的一部分,形成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
任何人都可以对此有所了解吗?
答案 0 :(得分:2)
RTRIM()
的字符组成一个集合,而不是单个字符串。所以每个都是单独处理的(见here)。
我不明白为什么这个查询需要RTRIM()
。 listagg()
仅将分隔符字符串放在值之间。
这应该做你想要的:
select listagg(r1.r_val,
'''),(''1'',''') within group (order by r1.r_val)
)