将列值拆分为动态列

时间:2019-03-01 21:34:50

标签: sql oracle

我有一个表table1,其中包含以下列:

file_name
dqID.AB_RES_ZEST_H2O_XYZ.LKG774548_00035_CAB_TS_HEST_H99_WED_45430098138.txt_154853452388.txt.xml
dqID.AB_RES_ZEST_H2O_XYZ.LKG744348_022335_CAB_TS_HEST_H99_WED_445438138.txt_15344452388.txt.xml
dqID.AB_RES_ZEST_H2O_XYZ.LKG774548_000435_CAB_TS_HEST_H99_WED_45345138.txt_15485343458.txt.xml

我希望根据值创建动态列数,并使用_和。进行拆分。

因此,输出将是:

file_name                                                                                                  part1    part2   part3   part4......
dqID.AB_RES_ZEST_H2O_XYZ.LKG774548_00035_CAB_TS_HEST_H99_WED_45430098138.txt_154853452388.txt.xml           dqID     AB     RES   ZEST....
dqID.AB_RES_ZEST_H2O_XYZ.LKG744348_022335_CAB_TS_HEST_H99_WED_445438138.txt_15344452388.txt.xml             dqID     AB     RES   ZEST....
dqID.AB_RES_ZEST_H2O_XYZ.LKG774548_000435_CAB_TS_HEST_H99_WED_45345138.txt_15485343458.txt.xml              dqID     AB     RES   ZEST....

Oracle SQL中仍然存在使用2 _.

将文本拆分为多个部分的问题。

还可以动态创建零件列吗?因为字符串可以包含很多_.,也可以包含很少的_.

1 个答案:

答案 0 :(得分:2)

如前所述,sql查询必须返回一组 fixed 列,因此动态部分不能在纯SQL中执行。

以下是一种使用REGEXP_SUBSTR()将字符串拆分为固定数量的列的解决方案:

SELECT
    file_name,
    REGEXP_SUBSTR(file_name, '[^._]+', 1, 1) as part1,
    REGEXP_SUBSTR(file_name, '[^._]+', 1, 2) as part2,
    REGEXP_SUBSTR(file_name, '[^._]+', 1, 3) as part3
FROM table1

您可以在结果集中添加任意多的列。

正则表达式说明:

[             # any character
    ^         #     other than
        .     #         a dot
        _     #         or an underscore
]             #
+             # occuring at least once

因此,基本上,这将捕获分隔符._之间的字符串部分。