在 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
我有一个要求,如果用户 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