【问题标题】:I want the output without using the case or decode in Oracle 10g我想要在 Oracle 10g 中不使用大小写或解码的输出
【发布时间】:2015-04-14 14:21:15
【问题描述】:
 STUD_ID SUBJECT              GRADE

 1       math                 a
 1       english              b
 1       computer             c
 2       math                 c
 2       lang                 a
 3       phys                 a
 3       chem                 b

输出应该是这样的:

  stud_id   grades
    1       a,b,c
    2       c,a
    3       a,b

【问题讨论】:

标签: sql oracle string-aggregation listagg


【解决方案1】:

如果您使用的是 Oracle 版本 11g 及更高版本,您可以简单地使用 LISTAGG 字符串聚合函数。

例如,

*SELECT deptno, LISTAGG(ename, ',') WITHIN GROUP (ORDER BY ename) AS employees
FROM   emp
GROUP BY deptno;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

对于其他版本特定的解决方案,请参阅演示的示例here

注意请记住,不要使用wm_concat,它在之前的 12c 版本中没有记录,并且在 12c 中不受支持。详情请见我的回答here

更新关于 OP 关于 10g 解决方案的请求。

Tim Hall 的文章中提到了两种方法:

  • Oracle 10g 中的COLLECT 函数

例如,

CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(4000);
/

CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab  IN  t_varchar2_tab,
                                          p_delimiter     IN  VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
  l_string     VARCHAR2(32767);
BEGIN
  FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
    IF i != p_varchar2_tab.FIRST THEN
      l_string := l_string || p_delimiter;
    END IF;
    l_string := l_string || p_varchar2_tab(i);
  END LOOP;
  RETURN l_string;
END tab_to_string;
/
  • ROW_NUMBER()SYS_CONNECT_BY_PATH 函数在 Oracle 9i 及更高版本中

例如,

SELECT deptno,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(ename,','))
       KEEP (DENSE_RANK LAST ORDER BY curr),',') AS employees
FROM   (SELECT deptno,
               ename,
               ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) AS curr,
               ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY ename) -1 AS prev
        FROM   emp)
GROUP BY deptno
CONNECT BY prev = PRIOR curr AND deptno = PRIOR deptno
START WITH curr = 1;

    DEPTNO EMPLOYEES
---------- --------------------------------------------------
        10 CLARK,KING,MILLER
        20 ADAMS,FORD,JONES,SCOTT,SMITH
        30 ALLEN,BLAKE,JAMES,MARTIN,TURNER,WARD

3 rows selected.

【讨论】:

  • 非常感谢您的回答..我使用 10g,您知道如何在 10g 上进行操作吗...
  • @Sam 好的,请参阅我的更新答案。我添加了几个例子。请将其标记为已回答,也会对其他人有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2021-05-15
  • 2021-11-12
  • 2015-04-24
  • 1970-01-01
相关资源
最近更新 更多