将两行连接成1个oracle,

时间:2015-10-26 19:14:25

标签: sql oracle oracle11g

我的数据如下。

> 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;

只有当我将id硬编码到函数where子句

中时它才会起作用
where id like(id + '%')

喜欢这样

where id like(00001%')

对此的任何帮助都会很棒。

2 个答案:

答案 0 :(得分:0)

为什么不将光标更改为

>>> regex.findall(u'\\X', u'A\u0332\u0305BC')
[u'A\u0332\u0305', u'B', u'C']
>>> len(regex.findall(u'\\X', u'A\u0332\u0305BC'))
3

答案 1 :(得分: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)'