我需要这个问题的帮助: 我有一个名为phone_number的列,我想查询此列以获取最后一次出现的'的字符串。'在一个单独的SQL查询中的各种数字。
示例#:
515.123.1277
011.44.1345.629268
我需要分别获得1277和629268。
到目前为止我有这个: 选择phone_number, 长度(phone_number)< = 12时的情况 然后 SUBSTR(PHONE_NUMBER,-4) 其他 substr(phone_number,-6)结束 来自员工;
这适用于此示例,但我希望它适用于各种#格式。
获得一些意见会很棒。
由于
答案 0 :(得分:3)
它应该像这个正则表达式一样简单:
SELECT phone_number, REGEXP_SUBSTR(phone_number, '[^.]*$')
FROM employees;
使用结束锚$
,它应该在最终.
之后获得不是.
字符的所有内容。如果最后一个字符为.
,则会返回NULL
。
答案 1 :(得分:2)
搜索包含句点的模式,[.]
带有数字\d
,后跟字符串的结尾$
。
通过在括号中放置模式\d
,将数字与字符组相关联(见下文)。这是使用subexpr参数1
(最后一个参数)引用的。
以下是解决方案:
SCOTT@dev> list
1 WITH t AS
2 ( SELECT '414.352.3100' p_number FROM dual
3 UNION ALL
4 SELECT '515.123.1277' FROM dual
5 UNION ALL
6 SELECT '011.44.1345.629268' FROM dual
7 )
8* SELECT regexp_substr(t.p_number, '[.](\d+)$', 1, 1, NULL, 1) end_num FROM t
SCOTT@dev> /
END_NUM
========================================================================
3100
1277
629268
答案 2 :(得分:1)
你可以在oracle中做这样的事情:
select regexp_substr(num,'[^\.]+',1,regexp_count(num,'\.')+1) last_number from
(select '515.123.1277' num from dual union all
select '011.44.1345.629268' from dual );
在11gR2之前,您可以使用regexp_replace
代替regexp_count
:
select regexp_substr(num,'[^\.]+',1,length(regexp_replace (num , '[^\.]+'))+1) last_number from
(select '515.123.1277' num from dual union all
select '011.44.1345.629268' from dual );