在 oracle 中将 1,2,3,4 显示为 1-4 pl/sql

Display 1,2,3,4 as 1-4 in oracle pl/sql

我有一个要求,如果用户 selects 复选框包含类型 1 的 1,2,3,4 和类型 2 的 2,3 那么我应该显示为 (1-4)type1 , (2-3)type2 作为输出。我们必须在后端进行。我已经使用 LISTAGG 但无法获得所需的输出。用户 select 选中了复选框,我们将值存储在 Oracle 数据库中。任何输入都会有很大帮助。

对于Ex,以下是我的数据。

Type Options
1 1
1 2
2 2
1 3
2 3
1 4

使用 LISTAGG 我可以获得: select 类型 , listagg(选项,',') 组内 (按类型排序)selectedOption from ( select .... )

Type selectedOption
1 1,2,3,4
2 2,3

期望的输出:

Type selectedOption
1 1-4
2 2-3

您可以使用MATCH_RECOGNIZE找到范围边界然后聚合:

SELECT type,
       LISTAGG(
         CASE
         WHEN range_start = range_end
         THEN TO_CHAR( range_start )
         ELSE range_start || '-' || range_end
         END,
         ','
       ) WITHIN GROUP ( ORDER BY mn ) AS grouped_values
FROM   table_name
MATCH_RECOGNIZE(
  PARTITION BY type
  ORDER BY value
  MEASURES
    FIRST( value ) AS range_start,
    LAST( value )  AS range_end,
    MATCH_NUMBER() AS mn
  ONE ROW PER MATCH
  PATTERN ( successive_values* last_value )
  DEFINE successive_values AS NEXT( value ) <= LAST( value ) + 1
)
GROUP BY type

其中,对于示例数据:

CREATE TABLE table_name ( type, value ) AS
SELECT 1, COLUMN_VALUE
FROM TABLE( SYS.ODCINUMBERLIST( 1, 2, 10, 17, 3, 15, 4, 16, 5, 7, 8 ) )
UNION ALL
SELECT 2, COLUMN_VALUE
FROM TABLE( SYS.ODCINUMBERLIST( 2, 3 ) )

输出:

TYPE | GROUPED_VALUES  
---: | :---------------
   1 | 1-5,7-8,10,15-17
   2 | 2-3             

db<>fiddle here