我的桌子结构和下面给出的相似
1001 Jon
1002 Jacob
1003 Cayle我想要从表中提取记录的方式应该是这样的
1001 – Jon, 1002 – Jacob, 1003 – Cayle有谁能建议一些简单的方法。
发布于 2017-06-04 09:51:44
Oracle实现这一目标的最简单方法是listagg。试着做这样的事情:
create table parameter as
select 1001 as id, cast('Jon' as varchar2(10)) as name from dual union all
select 1002, 'Jacob' from dual union all
select 1003, 'Cayle' from dual
;
select listagg(id||' - '||name, ', ') within group (order by id) as list
from parameter
;
LIST
------------------------------------------
1001 - Jon, 1002 - Jacob, 1003 - Cayle 甲骨文的另一个解决方案。我认为移植到其他RDBMS是很容易的:
select
rtrim(
xmlagg(
хmlElement(tag, id||' - '||name, ', ').еxtract('//text()') order by id
).getStringVal(), ', ') as list
from parameter
;
LIST
-------------------------------------------
1001 - Jon, 1002 - Jacob, 1003 - Cayle 如果您的表非常小,则可能会定义您的特定函数。这个函数可以很容易地移植到任何RDBMS:
create or replace function paramList return varchar2 is
ret varchar2(1024) := null;
begin
for row_ in (select id||' - '||name as tag from parameter) loop
ret := ret||', '||row_.tag;
end loop;
return ltrim(ret, ', ');
end paramlist;
/
show errors
col parameters format a40
select paramList parameters from dual;
PARAMETERS
----------------------------------------
1001 - Jon, 1002 - Jacob, 1003 - Cayle 或更通用的功能:
create or replace function concatRows (cursor_ sys_refcursor) return varchar2 is
ret varchar2(32767);
tmp varchar2(32767);
begin
loop fetch cursor_ into tmp;
exit when cursor_%notfound;
ret := ret || ', ' || tmp;
end loop;
return ltrim(ret, ', ');
end ;
/
select concatRows(cursor(
select id||' - '||name from parameter
)) parameters from dual
;
PARAMETERS
----------------------------------------
1001 - Jon, 1002 - Jacob, 1003 - Cayle 使用collect的另一个泛型函数
create or replace function arrayagg (arr sys.ODCIVarchar2List, delimiter varchar2 default ', ') return varchar2 is
ret varchar2(32767);
begin
for i in arr.first.. arr.last loop
ret := ret||arr(i)||delimiter;
end loop;
return rtrim(ret, delimiter);
end arrayagg;
/
select arrayagg(cast(collect(id||' - '||name) as sys.ODCIVarchar2List)) parameters
from parameter
;
PARAMETERS
-----------------------------------------
1001 - Jon, 1002 - Jacob, 1003 - Cayle 发布于 2017-06-04 08:23:41
select STUFF((
SELECT ', ' + CONCAT(CAST(id as varchar(10)), ' - ', name)
FROM mytable md
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
;
GO
| (No column name) |
| :-------------------------------------- |
| 1001 - Jon, 1002 - Jacob, 1003 - Cayle |dbfiddle http://dbfiddle.uk/?rdbms=sqlserver_2016&fiddle=3abd67c9ac08d67f558b6fc8b6dda0c5
发布于 2017-06-05 17:07:22
从表中在组(按id排序)中选择listagg(id\x\
https://stackoverflow.com/questions/44352068
复制相似问题