【问题标题】:How to retrieve two columns data in A,B format in Oracle如何在Oracle中以A,B格式检索两列数据
【发布时间】:2012-08-22 03:24:01
【问题描述】:

我在 oracle 数据库中有两列

+---------+---------+
| Column1 | Column2 |
+---------+---------+
| A       | 1       |
| A       | 2       |
+---------+---------+

我想收回数据,就像我会得到数据一样

+---------+---------+
| Column1 | Column2 |
+---------+---------+  
| A       | 1,2     |
+---------+---------+

请给我解决办法。

【问题讨论】:

标签: string oracle


【解决方案1】:

所有答案都是正确的,我想添加一个案例来解决小问题。在我的情况下,my_column1 类型是 nvarchar2 但文本是 number 并且下面的代码不起作用并且只显示空格:

select group_id, listagg( t.my_column1 || '-' || to_char(t.doc_date,'dd.mm.yyyy') ||  ' ') within group(order by doc_date) 
 from my_table t
 group by group_id

当我这样写时它可以工作。

select group_id, listagg( to_char(t.my_column1) || '-' || to_char(t.doc_date,'dd.mm.yyyy') ||  ' ') within group(order by doc_date) 
 from my_table t
 group by group_id

我希望我的反馈可以节省别人的时间

【讨论】:

    【解决方案2】:

    在我的 oracle 版本 10 上它可以完成这项工作:

    SELECT column1, wm_concat( column2)
      FROM table_name
     GROUP BY column1
    

    【讨论】:

      【解决方案3】:

      如果你有10g,那么你必须通过下面的函数:

      CREATE OR REPLACE FUNCTION get_comma_separated_value (input_val  in  number)
        RETURN VARCHAR2
      IS
        return_text  VARCHAR2(10000) := NULL;
      BEGIN
        FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP
          return_text := return_text || ',' || x.col2 ;
        END LOOP;
        RETURN LTRIM(return_text, ',');
      END;
      /
      

      所以,你可以这样做:

      select col1, get_comma_separated_value(col1) from table_name
      

      Fiddle here

      如果你有oracle 11g,可以使用listagg

      SELECT 
          col1,
          LISTAGG(col2, ', ') WITHIN GROUP (ORDER BY col2) "names"
      FROM table_x
      GROUP BY col1
      

      Fiddle here for Listagg

      对于 mysql,它会很简单:

      SELECT col1, GROUP_CONCAT(col2) FROM table_name GROUP BY col1
      

      【讨论】:

        【解决方案4】:

        Tim Hall 有一个非常规范的 string aggregation techniques in Oracle 列表。

        您使用哪种技术取决于许多因素,包括 Oracle 的版本以及您是否正在寻找纯 SQL 解决方案。如果您使用的是 Oracle 11.2,我可能会建议使用 LISTAGG

        SELECT column1, listagg( column2, ',' ) WITHIN GROUP( order by column2 )
          FROM table_name
         GROUP BY column1
        

        如果您使用的是早期版本的 Oracle,假设您不需要纯 SQL 解决方案,我通常更喜欢使用 user-defined aggregate function 方法。

        【讨论】:

        猜你喜欢
        • 2016-03-17
        • 2012-12-18
        • 1970-01-01
        • 2022-08-11
        • 1970-01-01
        • 1970-01-01
        • 2018-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多