2013-07-17 4 views
3

У меня есть некоторые таблицы TABLE1 с данными:Oracle 11g: LISTAGG игнорирует пустые значения

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

(FIDDLE)

Когда я выполнения:

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

я получаю: FOO#BAR#EXP, но я хочу иметь: FOO#BAR##EXP

(LISTAGG игнорирование пустых ячеек: /)

Любая идея достичь этого без написания собственной функции?

ответ

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

вы можете использовать NVL(col1, '#') здесь вы можете передать любое значение вместо null.

HErE is the demo

+0

soory работающий над этим. –

0

Попробуйте

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

SQL FIDDLE DEMO

+0

Да @bvr, u r правильный. – TechDo

0

Попробуйте так:

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

Sql скрипку Demo

0

Пожалуйста, попробуйте:

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

Другой подход, используя model clause.

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 Demo

+0

WOW! Человек, ты можешь объяснить эту магию? :) – WBAR

+0

@WBAR Дополнительная информация о [model clause] (http://docs.oracle.com/cd/E11882_01/server.112/e26088/statements_10002.htm#i2172805) –

1
select substr(listagg('#'||col1) within group (order by rownum),2) 
from table1 

Prepend разделитель перед каждым значением (это дает разделитель только для значения NULL), то совокупная без сепаратора, и полоса ведущего сепаратора.

Смежные вопросы