我的数据如下。
> 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%')
对此的任何帮助都会很棒。
答案 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)'