【问题标题】:How to use Oracle's LISTAGG function with a multi values?如何使用具有多值的 Oracle 的 LISTAGG 函数?
【发布时间】:2018-08-28 11:40:40
【问题描述】:

我有一个如下所示的“ITEMS”表:

ITEM_NO     ITEM_NAME   
1               Book   
2               Pen   
3               Sticky Notes   
4               Ink   
5               Corrector   
6               Ruler  

在另一个“EMP_ITEMS”表中,我有以下内容:

EMPLOYEE        ITEMS_LIST   
 John           1,2   
 Mikel          5   
 Sophia         2,3,6  
 William        3,4   
 Daniel         null   
 Michael        6  

输出必须是这样的:

EMPLOYEE        ITEMS_LIST      ITEM_NAME   
John            1,2             Book,Pen   
Mikel           5               Corrector   
Sophia          2,3,6           Pen,Sticky Notes,Ruler   
William         3,4             Sticky Notes,Ink   
Daniel          null            null   
Michael         6               Ruler

我使用了以下查询:

SELECT e.EMPLOYEE,e.ITEMS_LIST, LISTAGG(i.ITEM_NAME, ',') WITHIN GROUP (ORDER BY i.ITEM_NAME) ITEM_DESC 
 FROM EMP_ITEMS e  
INNER JOIN ITEMS i ON i.ITEM_NO = e.ITEMS_LIST 
GROUP BY e.EMPLOYEE,e.ITEMS_LIST;

但是有一个错误:

ORA-01722: 无效号码

【问题讨论】:

    标签: oracle select listagg


    【解决方案1】:

    但是有错误:ORA-01722: invalid number

    这是因为您的ITEMS_LIST 是由数字和逗号字符组成的字符串,实际上不是数字列表,您正在尝试将单个项目编号与项目列表进行比较。

    而是把它当作一个字符串来寻找子字符串匹配。为此,您需要将字符串包围在分隔符中并比较以查看一个是否是另一个的子字符串:

    SQL Fiddle

    Oracle 11g R2 架构设置

    CREATE TABLE Items ( ITEM_NO, ITEM_NAME ) As
    SELECT 1, 'Book' FROM DUAL UNION ALL
    SELECT 2, 'Pen' FROM DUAL UNION ALL
    SELECT 3, 'Sticky Notes' FROM DUAL UNION ALL
    SELECT 4, 'Ink' FROM DUAL UNION ALL
    SELECT 5, 'Corrector' FROM DUAL UNION ALL
    SELECT 6, 'Ruler' FROM DUAL;
    
    CREATE TABLE emp_items ( EMPLOYEE, ITEMS_LIST ) AS
    SELECT 'John', '1,2' FROM DUAL UNION ALL
    SELECT 'Mikel', '5' FROM DUAL UNION ALL
    SELECT 'Sophia', '3,2,6' FROM DUAL UNION ALL
    SELECT 'William', '3,4' FROM DUAL UNION ALL
    SELECT 'Daniel', null FROM DUAL UNION ALL
    SELECT 'Michael', '6' FROM DUAL;
    

    查询 1

    SELECT e.employee,
           e.items_list,
           LISTAGG( i.item_name, ',' )
             WITHIN GROUP (
               ORDER BY INSTR( ','||e.items_list||',', ','||i.item_no||',' )
             ) AS item_names
    FROM   emp_items e
           LEFT OUTER JOIN
           items i
           ON ( ','||e.items_list||',' LIKE '%,'||i.item_no||',%' )
    GROUP BY e.employee, e.items_list
    

    Results

    | EMPLOYEE | ITEMS_LIST |             ITEM_NAMES |
    |----------|------------|------------------------|
    |     John |        1,2 |               Book,Pen |
    |    Mikel |          5 |              Corrector |
    |   Daniel |     (null) |                 (null) |
    |   Sophia |      3,2,6 | Sticky Notes,Pen,Ruler |
    |  Michael |          6 |                  Ruler |
    |  William |        3,4 |       Sticky Notes,Ink |
    

    【讨论】:

      猜你喜欢
      • 2015-10-23
      • 2021-05-29
      • 2016-07-25
      • 1970-01-01
      • 2021-11-27
      • 2012-12-02
      • 1970-01-01
      • 2011-11-13
      相关资源
      最近更新 更多