首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在sql中的同一行中获取不同的记录?

问如何在sql中的同一行中获取不同的记录?
EN

Stack Overflow用户
提问于 2017-06-04 08:11:57
回答 3查看 628关注 0票数 1

我的桌子结构和下面给出的相似

代码语言:javascript
复制
1001    Jon
1002    Jacob
1003    Cayle

我想要从表中提取记录的方式应该是这样的

代码语言:javascript
复制
1001 – Jon,   1002 – Jacob,  1003 – Cayle

有谁能建议一些简单的方法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-04 09:51:44

Oracle实现这一目标的最简单方法是listagg。试着做这样的事情:

代码语言:javascript
复制
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是很容易的:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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  

或更通用的功能:

代码语言:javascript
复制
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的另一个泛型函数

代码语言:javascript
复制
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  
票数 9
EN

Stack Overflow用户

发布于 2017-06-04 08:23:41

在Server中,您可以使用料子和对于XML获得它。

代码语言:javascript
复制
 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

票数 2
EN

Stack Overflow用户

发布于 2017-06-05 17:07:22

从表中在组(按id排序)中选择listagg(id\x\

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44352068

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档