如何在不使用SUBSTR()的情况下从字符列中提取子字符串?

时间:2016-10-06 20:26:06

标签: sql oracle oracle11g

我对以下数据有疑问。

您显然可以看到每个EMP_IDENTIFIER都与EMP_ID相关联。 所以我需要只提取10个字符的标识符来插入另一列。 我该怎么做?

我使用INSTRSUBSTR做了一些传统方式。 我只是想知道有没有其他方法可以做到这一点但不使用INSTRSUBSTR

EMP_ID(VARCHAR2)EMP_IDENTIFIER(VARCHAR2)
62049       62049-2162400111
6394        6394-1368000222
64473       64473-1814702333
61598       61598-0876000444
57452       57452-0336503555
5842        5842-0000070666
75778       75778-0955501777
76021       76021-0546004888
76274       76274-0000454999
73910       73910-0574500122

我正在使用Oracle 11g。

3 个答案:

答案 0 :(得分:0)

如果你想要标识符的第二部分,它总是10个字符:

select t.*, substr(emp_identifier, -10) as secondpart
from t;

答案 1 :(得分:0)

这是一种方式:

   REGEXP_SUBSTR (EMP_IDENTIFIER, '-(.{10})',1,1,null,1)

这将在字符串中给出短划线(“ - ”)后面的第10个字符串。感谢mathguy的改进。

除此之外,您还必须提供有关选择所需标识符的确切逻辑的更多详细信息。

答案 2 :(得分:0)

因为显然这是出于学习目的......让我们说这项任务更加复杂。假设你有一个更长的输入字符串,它有几个用 - 分隔的组,这些组可以包括字母和数字。你知道至少有两个组是“仅数字”,你需要抓住第二个这样的“纯数字”组。那么类似的东西将起作用(并且不会有instr / substr解决方案):

select regexp_substr(input_str, '(-|^)(\d+)(-|$)', 1, 2, null, 2) from ....

这将在输入字符串中搜索一个或多个数字(\d表示+或字符串开头之间的任何数字-表示一次或多次出现){{{ 1}}表示字符串的开头; ^表示匹配(a|b)a)和b或字符串的结尾(-表示结束字符串)。它开始在第一个字符处搜索(函数的第二个参数是1);它寻找第二次出现(参数2);它不执行任何特殊匹配,例如忽略大小写(函数的参数“null”),并且当找到匹配时,返回第二组括号中包含的匹配模式的片段(最后一个参数,2 ,到正则表达式函数)。第二个片段是$ - 数字序列,没有前导和/或尾随短划线\d+

此解决方案也适用于您的示例,它只是矫枉过正。它会找到像AS23302-ATX-20032-33900293-CWV20-3499-RA这样的“仅数字”组。它将返回第二个数字组33900293。