今天,同事问了我一个oracle的问题,在他查询的表中有多行数据除了一个字段外都是相同的,他想合并成一条,并且把那个不同的字段用逗号连接起来,我想了一会儿,觉得除了相关子查询我想不出其他方法来。
但是我试验后发现,思路到是对,但是因为我不清楚有多少一样的,所以我觉得应该做成一个function来循环
要求得到的结果是这样的
根据需要得到的结果我创建了一个function:
然后使用后得到以下结果
我在google下搜索了下,oracle可以自定义聚合函数来搞定这个问题,不过语句有点复杂,要多学习学习.
但是我试验后发现,思路到是对,但是因为我不清楚有多少一样的,所以我觉得应该做成一个function来循环
SQL> desc t2
Name Null? Type
----------------------------------------- -------- ----------------------------
ID NUMBER
NAME VARCHAR2(10)
SQL> select * from t2;
ID NAME
---------- ----------
1 aa
1 bb
1 cc
2 asd
2 asdvvv
要求得到的结果是这样的
1 aa,bb,cc
2 asd,asdvvv
根据需要得到的结果我创建了一个function:
create or replace function v_t2(v_id in number)
return varchar2
is
v_str varchar2(1000);;--连接后字符串
str varchar2(10) default null;;--连接符号
begin
for s in (select name from t2 where id=v_id) loop
v_str := v_str ||str||s.name;
str :=',';
end loop;
return v_str;
end;
然后使用后得到以下结果
SQL> select distinct id,v_t2(id) from t2;
ID V_T2(ID)
---------- ------------------------------
1 aa,bb,cc
2 asd,asdvvv
我在google下搜索了下,oracle可以自定义聚合函数来搞定这个问题,不过语句有点复杂,要多学习学习.