如何在 Oracle 中的每个破折号后划分字符并根据提取的值创建新列?

Posted

技术标签:

【中文标题】如何在 Oracle 中的每个破折号后划分字符并根据提取的值创建新列?【英文标题】:How to divide characters after every dash in Oracle and create new columns based on extracted values? 【发布时间】:2021-10-08 15:52:50 【问题描述】:

这是我的数据示例:

ID
3-1-2
4-50-15

我想要的是:

ID1 ID2 ID3
3 1 2
4 50 15

最好的方法是什么?

【问题讨论】:

【参考方案1】:

使用SUBSTRINSTR(因为它比正则表达式更快):

SELECT SUBSTR(ID, 1, INSTR(ID, '-', 1, 1) - 1) AS ID1,
       SUBSTR(
         ID,
         INSTR(ID, '-', 1, 1) + 1,
         INSTR(ID, '-', 1, 2) - INSTR(ID, '-', 1, 1) - 1
       ) AS ID2,
       SUBSTR(ID, INSTR(ID, '-', 1, 2) + 1) AS ID3
FROM   table_name;

其中,对于样本数据:

CREATE TABLE table_name (ID) AS
SELECT '3-1-2' FROM DUAL UNION ALL
SELECT '4-50-15' FROM DUAL;

输出:

ID1 ID2 ID3
3 1 2
4 50 15

如果您确实想使用(较慢的)正则表达式,那么:

SELECT REGEXP_SUBSTR(id, '[^-]+', 1, 1) AS id1,
       REGEXP_SUBSTR(id, '[^-]+', 1, 2) AS id2,
       REGEXP_SUBSTR(id, '[^-]+', 1, 3) AS id3
FROM   table_name;

sqlfiddle here

【讨论】:

以上是关于如何在 Oracle 中的每个破折号后划分字符并根据提取的值创建新列?的主要内容,如果未能解决你的问题,请参考以下文章

如何从用java编写的查询中将虚线字符串传递给oracle

连字符和破折号的奇怪案例

如何将所有包含连字符/破折号(?)的类应用于任何 DOM 元素并将它们保存到 JavaScript 中的数组中?

如何从字符串创建 SEO 友好的破折号分隔 url?

如何根据字符获取子字符串并从右侧开始读取字符串

如何验证字符串是不是仅包含字母、数字、下划线和破折号?