【问题标题】:String Aggregation in Oracle: Multiple Rows into Single ColumnOracle中的字符串聚合:多行到单列
【发布时间】:2013-10-28 17:39:11
【问题描述】:

嗨,我在 oracle 中有以下用于字符串聚合的函数

CREATE OR REPLACE FUNCTION STRING_AGGREGATE(i_query VARCHAR2,
i_seperator VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
AS
  l_return CLOB:='';
  l_temp VARCHAR(32000);
  TYPE r_cursor is REF CURSOR;
  rc r_cursor;
BEGIN
  OPEN rc FOR i_query;
  LOOP
    FETCH rc
    INTO L_TEMP;
    EXIT WHEN RC%NOTFOUND;
    l_return:=l_return||L_TEMP||i_seperator;
  END LOOP;
  RETURN RTRIM(l_return,i_seperator);
END;

当我调用这个函数时,它会这样显示

SELECT STRING_AGGREGATE('select ename from emp') ENAMES FROM DUAL;

ENAMES
---------------------------
SMITH,ALLEN,WARD,JONES,MARTIN,BLAKE,CLARK,SCOTT,KING,TURNER,ADAMS,JAMES,FORD,MILLER

这个函数在这里工作得很好,但是当我用多个带有空格的列调用这个函数时,它给了我错误,这是我的查询

SELECT STRING_AGGREGATE('select ename||' Job is '||Job from emp') ENAMES FROM DUAL;

我想得到结果

smith job is clerk,allen job is accountatnt,ward job is programmer etc..

请指导我如何实现这一目标

【问题讨论】:

  • 请提供有关错误的准确信息 - 错误代码、错误消息等。
  • 错误信息是 ora:00907 缺少右括号
  • 错误信息有点误导 - 在ename 之后和Job from emp 之前没有撇号 - 试试这个查询:SELECT STRING_AGGREGATE('select ename '||' Job is '|| 'Job from emp') ENAMES FROM DUAL;

标签: oracle oracle11g oracle10g string-concatenation


【解决方案1】:

我知道这是一个老问题,但我想我会使用 Oracle 提供的函数LISTAGG 提供解决方案。

运行:

select listagg(ename || ' is a ' || job, ', ')
within group (order by job, ename)
from   emp
where  job in ('MANAGER','ANALYST','CLERK');

你会得到:

福特是分析师,斯科特是分析师,亚当斯是文员,詹姆斯是文员,米勒是文员,史密斯是文员,布莱克是经理,克拉克是经理,琼斯是经理

【讨论】:

    【解决方案2】:

    你必须转义单引号

    SELECT STRING_AGGREGATE('select ename||'' Job is ''||Job from emp') ENAMES FROM DUAL;
    

    你可以试试如何将字符串传递给这样的函数

    SELECT 'select ename||'' Job is ''||Job from emp' FROM DUAL;
    

    给你

    select ename||' Job is '||Job from emp
    

    查看演示:http://sqlfiddle.com/#!2/d41d8/23283

    (顺便说一句。自 Oracle 11g 以来有一个新功能LISTAGG,您可能还想看看。)

    【讨论】:

    • 现在这个查询给了我同样的错误SELECT DEPTNO,STRING_AGGREGATE('SELECT ENAME FROM EMP WHERE DEPTNO='||DEPTNO,',' and job='Programmer')ENAME FROM EMP GROUP BY DEPTNO ORDER BY 1
    • 每次你在第一个和最后一个'之间有一个',你必须将'加倍,就像''一样。好的?这意味着“逃避”。我也认为DEPTNO 有问题。我认为应该是:SELECT DEPTNO,STRING_AGGREGATE('SELECT ENAME FROM EMP WHERE DEPTNO='||DEPTNO||' and job=''Programmer''')ENAME FROM EMP GROUP BY DEPTNO ORDER BY 1
    • 我尝试检查您的查询,但它给我错误缺少右括号
    • 这个查询对我有用 SELECT DEPTNO,STRING_AGGREGATE('SELECT ENAME FROM EMP WHERE DEPTNO='||DEPTNO,',')ENAME FROM EMP GROUP BY DEPTNO ORDER BY 1 但是当我使用 and job=''Programmer'' 它不起作用
    • 可能是大写/小写问题。你可以试试lower(job) = ''programmer'' 吗?
    猜你喜欢
    • 1970-01-01
    • 2013-07-04
    • 2019-12-10
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2013-06-23
    • 1970-01-01
    相关资源
    最近更新 更多