如何解决oracle pl/sql中将1,2,3,4显示为1-4
我有一个要求,如果用户选择包含类型 1 的 1,2,3,4 和类型 2 的 2,3 的复选框,那么我应该显示为 (1-4)type1,(2-3)type2 作为输出。我们必须在后端做。我使用了 LISTAGG
,但无法获得所需的输出。用户选中复选框,我们将值存储在 Oracle 数据库中。任何输入都会有很大帮助。
对于Ex,以下是我的数据。
类型 | 选项 |
---|---|
1 | 1 |
1 | 2 |
2 | 2 |
1 | 3 |
2 | 3 |
1 | 4 |
使用 LISTAGG 我可以获得: 选择 类型 , listagg(选项,',') 组内 (ORDER BY Type) selectedOption from ( select .... )
类型 | selectedOption |
---|---|
1 | 1,4 |
2 | 2,3 |
期望的输出:
类型 | 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,15-17 2 | 2-3
dbfiddle here
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。