从字符串中最有效的方式检索数字

时间:2016-05-19 13:01:08

标签: sql oracle

我想知道是否有更好,更优的方法从字符串中检索数字 例如

"O5_KK/text1/1239312/006_textrandom"
"O5_KK/text1/1239315/0109_textrandom123"
"O5_KK/text1/1239318/0110_textrandom432"

'O5_KK/text1' - hardcoded, never change.
1239312,1239315,1239318 - random number, unique within row
textrandom,textrandom123,textrandom432 - random string

作为输出我想只得到数字:

006
0109
0110

我知道如何使用instr,substr,replace函数来完成它。但看起来很糟糕。我正在寻找其他解决方案,任何提示?

由于

3 个答案:

答案 0 :(得分:5)

您可以使用regexp_subtr()

select regexp_substr(val, '/[0-9]+_', 1, 1)

然后删除多余的字符:

select replace(replace(regexp_substr(val, '/[0-9]+_', 1, 1), '/', ''), '_', '')

答案 1 :(得分:1)

这只是第二个下划线之前的第三个斜杠之后的部分:

substr(str, instr(str, '/', 1, 3) + 1, instr(str, '_', 1, 2) - instr(str, '/', 1, 3) - 1)

答案 2 :(得分:1)

假设您需要的数字始终位于最后一个斜杠(/)和最后一个下划线(_)之间,而中间没有任何字符 - 就像您的样本中一样 - 最佳解决方案仅使用substr和instr。请注意,正则表达式比直接子行和instr慢;有些情况下,唯一的解决方案是regexpr(或者regexpr更容易编写和维护),但这不是其中之一。

select substr(val, instr(val,'/',-1)+1, instr(val,'_',-1)-instr(val,'/',-1)-1)