8

私はデータを含むいくつかのテーブルTABLE1を持っています:

+------------+
|    COL1    |
+------------+
|   FOO      |
|   BAR      |
|  (null)    |
|   EXP      |
+------------+

( フィドル)

私が実行するとき:

SELECT listagg(col1, '#') within group(ORDER BY rownum) 
  FROM table1

私は受け取ります:FOO#BAR#EXPしかし、私はしたいです:FOO#BAR##EXP

(LISTAGG空のセルを無視します:/)

独自の関数を記述せずにそれを達成するためのアイデアはありますか?

4

7 に答える 7

8
select replace(listagg(NVL(col1, '#'), '#') 
within group(order by rownum),'###','##') from table1

NVL(col1, '#') null の代わりに任意の値を渡すことができます。

デモはこちら

于 2013-07-17T10:46:13.950 に答える
6
select substr(listagg('#'||col1) within group (order by rownum),2)
from table1

各値の前にセパレーターを追加し (これにより、NULL の場合にのみセパレーターが生成されます)、セパレーターなしで集計し、先頭のセパレーターを取り除きます。

于 2014-08-05T09:45:49.037 に答える
2

この方法を試してください:

select replace(
                listagg(coalesce(col1,'replace'), '#') 
                within group(order by rownum),      
       'replace','') 
from table1

SQL フィドルのデモ

于 2013-07-17T10:45:51.717 に答える
1

してみてください:

select replace(listagg(nvl(col1, '#') , '#') 
       within group(order by rownum), '##', '#') 
from table1
于 2013-07-17T11:00:41.037 に答える
1

モデル句を使用した別のアプローチ。

SQL> select rtrim(res, '#') as col1
  2    from ( select res
  3                , rn
  4             from table1
  5             model
  6             dimension by (rownum as rn)
  7             measures(cast(null as varchar2(500)) as res, col1)
  8             rules(
  9               res[any] order by rn desc= col1[cv()] || '#' || res[cv() + 1]
 10             )
 11          )
 12   where rn = 1
 13  /

COL1
--------------------
FOO#BAR##EXP

SQLFiddle デモ

于 2013-07-17T11:30:05.593 に答える
0

これを試して

select 
  REPLACE(listagg(NVL(col1,' '), '#') within group(order by rownum),'# #','##') 
from table1

SQL フィドルのデモ

于 2013-07-17T10:44:17.477 に答える