对列数据进行排序,使得数字首先出现,然后是字母数字,按顺序说明如下

时间:2016-05-19 14:15:10

标签: sql oracle sorting

需要对数据进行排序,以便列中的值列表如下所示

12A
12B
3
4
12H
RR

然后在排序和聚合后我需要其输出如下,

new_agg_col

3,4,12A,12B,12H,RR

我正在使用listagg函数来汇总一行数据。

2 个答案:

答案 0 :(得分:0)

在您正在执行LISTAGG的表或查询中,您可以使用正则表达式提取一个只包含数字的新字段,另一个具有字母然后在LISTAGG的ORDER BY中,您可以使用这些列进行排序。

我现在没有时间查看完整代码,如果您需要,请告诉我。

没有测试我相信那些正则表达式

'([0-9]+)'

'([A-Za-z]+)'

答案 1 :(得分:0)

Oracle安装程序

CREATE TABLE table_name ( value ) AS
SELECT '12A' FROM DUAL UNION ALL
SELECT '12B' FROM DUAL UNION ALL
SELECT '3' FROM DUAL UNION ALL
SELECT '4' FROM DUAL UNION ALL
SELECT '12H' FROM DUAL UNION ALL
SELECT 'RR' FROM DUAL;

<强>查询

SELECT LISTAGG( value, ',' )
         WITHIN GROUP (
           ORDER BY TO_NUMBER( REGEXP_SUBSTR( value, '^\d+' ) ) NULLS LAST,
                    REGEXP_SUBSTR( value, '\D.*' )
         ) AS ordered_list
FROM   table_name;

<强>输出

ORDERED_LIST
------------------
3,4,12A,12B,12H,RR