使用oracle sql substr获取最后一位数字

使用oracle sql substr获取最后一位数字,sql,regex,oracle,substr,Sql,Regex,Oracle,Substr,我有一个查询结果,应该得到一列的最后数字,比如“term” The value of column term can be like: 'term' 'number' (output) --------------------------- xyz012 12 xyz112 112 xyz1 1 xyz02 2 xyz002 2 xyz88 88 注:不限于上述场景,但最后3个或更少

我有一个查询结果,应该得到一列的最后数字,比如“term”

The value of column term can be like:
'term'     'number' (output)
---------------------------
xyz012         12
xyz112         112
xyz1           1
xyz02          2
xyz002         2
xyz88          88
注:不限于上述场景,但最后3个或更少字符的要求可以是数字

我使用的函数:
to_number(substr(term.name,-3))
(最初我假设要求是最后3个字符总是数字,但我错了)

我使用to_数字,因为如果最后3位数字是“012”,那么数字应该是“12” 但正如人们在某些特定情况下所看到的,如“xyz88”、“xyz1”)会给出

ORA-01722:无效号码

如何使用substr或regexp\u substr实现这一点


没有深入研究regexp\u substr。

Oracle具有函数
regexp\u instr()
,它可以满足您的需要:

select term, cast(substr(term, 1-regexp_instr(reverse(term),'[^0-9]')) as int) as number

使用
REGEXP\u SUBSTR

select column_name, to_number(regexp_substr(column_name,'\d+$'))
 from table_name;
  • \d匹配数字。与+一起,它成为一个包含一个或多个数字的组
  • $匹配行尾
  • 把它们放在一起,这个正则表达式提取字符串末尾的一组数字
更多细节


演示。

Thx。这对我有用。尽管我有一个问题:使用“cast as int”而不是to_number有什么好处,但在这种情况下,两者都是一样的。所以基本上你可以反向字符串,找到第一个非位数的位置,1-得到substr最后的位数,cool@user1933888 . . . 我认为没有区别。我倾向于使用ANSI标准结构(可以跨数据库工作),但Oracle的方言应该是
to_number()
。好的,谢谢你们的解释,你们太酷了。尽管在道德困境中,你还是应该接受你的答案,还是接受“兰布林人”的答案,因为他的解决方案看起来更优雅。Thx。它可以工作,但只是好奇正则表达式“\d+$”到底做什么。我接受了第一个给出答案的人的回答。谢谢,你真是棒极了!。您的答案是最优雅的解决方案。似乎不能处理多个数字。@Tordek当答案非常清楚地提供了答案时,这怎么可能不能提供问题的答案?仅代码的答案会自动标记为低质量,因此在stackoverflow时不鼓励这样做。今后请详细说明你的答案,并解释为什么它是问题的解决方案。这有助于其他用户。
select SUBSTRING(acc_no,len(acc_no)-1,len(acc_no)) from table_name;