2015-10-26 26 views
0

我擁有的數據如下。將兩行連接成1個oracle,

> ID Somefield 
    00001  test1 
    00001s  test2 
    00002  test3 
    00002g  test4 

我想基於ID 最終結果的前五個數字的兩線來連接在一起,將

00001 test1,test2 
00002 test3,test4 

我能夠在11g中,但我與LISTAGG功能來做到這一點必須通過where子句並查看ID字段的長度。

我試圖創建一個功能

CREATE OR REPLACE FUNCTION row_concat_id(id   IN VARCHAR2, 
              currentfield IN VARCHAR2) 
    RETURN VARCHAR2 
AS 

    CURSOR c1 IS 
    SELECT listagg(currentfield, ',') within GROUP(ORDER BY currentfield)  
     FROM mytable 
    WHERE id LIKE (id + '%') 
    --where length(ID) > 5 
    GROUP BY subscriberid; 

    concatfield VARCHAR2(2000); 
BEGIN 

    dbms_output.put_line(id); 
    dbms_output.put_line(currentfield); 

    OPEN c1; 

    FETCH c1 INTO concatfield; 

    CLOSE c1; 

    RETURN concatfield; 

END row_concat_id; 

它只會工作,如果我硬編碼標識加入功能where子句

where id like(id + '%') 

像這樣

where id like(00001%') 

任何幫助這會很好。

+0

你是怎麼做到的'+'能串聯在Oracle 11g中的字符串? – diziaq

回答

0

輕度的意識模糊這裏......您正在使用光標剛組由id列?難道這樣的東西不適合你嗎?

SELECT substr(ID,0,5), listagg(somefield,',') 
FROM mytable 
GROUP BY substr(ID,0,5) 

顯然,如果你想這是一個功能,你需要準備的SQL使somefield將是一個字段名稱,而不是隻是一個字符串。

爲了詳細說明,你的光標會使用類似

EXECUTE IMMEDIATE 'SELECT substr('||ID||',0,5), listagg('||somefield||','''','''') 
    FROM mytable 
    GROUP BY substr('||ID||',0,5)' 
+0

我正在使用substr,但沒有在組中複製它。我在select和grouping中的substr列上做了一個別名。這工作表示感謝 –

+0

雖然這個作品我有大約15列,他們都需要在組中。什麼是團體旁邊的替代方案? –

+0

@JoeCook你是什麼意思?這聽起來可能是一個全新的問題。你爲什麼按15個不同的列分組/爲什麼你不能把它們添加到你的組? –

0

爲什麼不改變你的光標

select listagg(SUBSTR(currentField,1,5), ',') within group (order by   
    SUBSTR(currentField,1,5))