科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Oracle多行记录字符串综合操作几种方法

Oracle多行记录字符串综合操作几种方法

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

怎么合并多行记录的字符串,一直是Oracle新手喜欢问的SQL问题之一,关于这个问题的帖子我看过不下30个了,现在就对这个问题,进行一个总结。 合并 什么是合并多行字符串(连接字符串)呢。

作者:中国IT实验室 来源:中国IT实验室 2007年10月7日

关键字: ORACLE

  • 评论
  • 分享微博
  • 分享邮件

在本页阅读全文(共3页)

使用:


SQL> select DISTINCT(T.country),
list_func1(t.country) from test t;
COUNTRY              LIST_FUNC1(T.COUNTRY)
-------------------- ----------------
中国                 台北, 香港, 上海
日本                 东京, 大阪
SQL> select t.country,str_list(t.country) 
from test t GROUP BY t.country;
COUNTRY              STR_LIST(T.COUNTRY)
-------------------- -----------------------
中国                 台北, 香港, 上海
      日本                 东京, 大阪

这个时候,使用分组和求唯一都可以满足要求。它的原理就是,根据唯一的分组字段country,在函数里面再次查询该字段对应的所有被合并列,使用PL/SQL将其合并输出。

3.灵活表函数法 灵活性★★★ 性能★★★ 难度 ★★★

该方法是在方法2的基础上,使用动态SQL,将表名和字段名称传入,从而达到灵活的目的。

create or replace function str_list2
( key_name in varchar2,
key  in varchar2,
coname in varchar2,
tname     in varchar2 )
return varchar2
as
    type rc is ref cursor;
    str    varchar2(4000);
    sep    varchar2(2);
    val    varchar2(4000);
    cur    rc;
begin
    open cur for 'select '||coname||'
                    from '|| tname || '
                    where ' || key_name || ' = :x '
                using key;
    loop
        fetch cur into val;
        exit when cur%notfound;
        str := str || sep || val;
        sep := ', ';
    end loop;
    close cur;
    return str;
end;
SQL> select test.country,
  2  str_list2('COUNTRY', 
     test.country, 'CITY', 'TEST') emplist
  3  from test
  4   group by test.country
  5  /
COUNTRY              EMPLIST
-------------------- -----------------
中国                 台北, 香港, 上海
      日本                 东京, 大阪

4.一条SQL语法:

灵活性★★★★ 性能★★ 难度 ★★★★

一条SQL的法则是某位大师提出的,大家曾经在某个时期都乐此不彼的寻求各种的问题一条SQL法,但是大师的意思似乎被曲解,很多性能差,可读性差,灵活差的SQL都是这个原则产物,所谓画虎不成反成犬类。不过,解决问题始终是第一原则,这里还是给出一个比较有代表性的一条SQL方法。

SELECT country,max(substr(city,2)) city
FROM
(SELECT country,sys_connect_by_path(city,',') city
FROM 
(SELECT country,city,country||
rn rchild,country||(rn-1) rfather
FROM 
(SELECT  test.country ,test.city,row_number() over 
(PARTITION BY test.country ORDER BY 
test.city) rn 
FROM test))
CONNECT BY PRIOR rchild=rfather 
START WITH rfather LIKE '%0')
      GROUP BY country;

下面分步解析,有4个FROM,就有4次结果集的操作。

step 1 给记录加上序号rn
SQL> SELECT  test.country ,test.city,row_number() over 
(PARTITION BY test.country ORDER 
BY test.city) rn
  2    FROM test
  3  /
COUNTRY              CITY                         RN
-------------------- -------------------- ----------
日本                 大阪                          1
日本                 东京                          2
中国                 上海                          1
中国                 台北                          2
      中国                 香港                          3

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章