我有一个名为phone_number 的列,我想查询此列以获取最后一次出现“.”的字符串。对于单个 SQL 查询中的所有类型的数字。
示例:
515.123.1277
011.44.1345.629268
我需要分别获取1277和629268。
到目前为止我有这个: 选择电话号码, 当长度(电话号码)<= 12 then substr(phone_number,-4) else substr (phone_number, -6) end from employees;
时的情况这适用于本示例,但我希望它适用于各种格式。
它应该像这个正则表达式一样简单:
SELECT phone_number, REGEXP_SUBSTR(phone_number, '[^.]*$')
FROM employees;
使用结束锚点
$
,它应该在最后一个.
之后获得所有不是.
字符的内容。如果最后一个字符是 .
那么它将返回 NULL
。
搜索包含句点
[.]
和数字 \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
你可以在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 );