2017-03-10 97 views
0

我有一個值列表,作爲動態查詢的一部分,形成in子句的元組。listagg問題的Oracle RTRIM

要做到這一點,我已經使用了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 

任何人都可以對此有所瞭解嗎?

回答

2

RTRIM()的字符形成一個集合,而不是一個字符串。因此每個都被單獨處理(見here)。

我不明白爲什麼RTRIM()這個查詢完全需要。 listagg()僅將分隔符字符串置於值之間。

這應該做你想要什麼:

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

壯觀,感謝G.這是從別人,我試圖清理這個bug的舊代碼,更有道理,現在 – JohnHC