最后一次出现字符之后的子字符串?

问题描述 投票:0回答:3

我有一个名为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;

时的情况

这适用于本示例,但我希望它适用于各种格式。

sql oracle substring
3个回答
4
投票

它应该像这个正则表达式一样简单:

SELECT phone_number, REGEXP_SUBSTR(phone_number, '[^.]*$')
  FROM employees;

使用结束锚点

$
,它应该在最后一个
.
之后获得所有不是
.
字符的内容。如果最后一个字符是
.
那么它将返回
NULL


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

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 );
© www.soinside.com 2019 - 2024. All rights reserved.