我对以下数据有疑问。
您显然可以看到每个EMP_IDENTIFIER
都与EMP_ID
相关联。
所以我需要只提取10个字符的标识符来插入另一列。
我该怎么做?
我使用INSTR
,SUBSTR
做了一些传统方式。
我只是想知道有没有其他方法可以做到这一点但不使用INSTR
,SUBSTR
。
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。
答案 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。