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

Posted

技术标签:

【中文标题】子字符串,在最后一次出现字符之后?【英文标题】:substring, after last occurrence of character? 【发布时间】:2015-05-11 04:04:43 【问题描述】:

我需要帮助解决这个问题: 我有一个名为 phone_number 的列,我想查询此列以获取最后一次出现 '.' 的字符串。用于单个 sql 查询中的各种数字。

示例#:

515.123.1277

011.44.1345.629268

我需要分别得到 1277 和 629268。

到目前为止,我有这个: 选择电话号码, 长度(电话号码)

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

很高兴能得到一些意见。

谢谢

【问题讨论】:

您已经为 Oracle、SQL Server 和 mysql 标记了这个,它们都有一组非常不同的函数来处理字符串。您实际使用的是哪个数据库?还是您在寻找三个完全不同的答案?从规范化的角度来看,您想要获取较长字符串的一个组件这一事实使我强烈怀疑您犯了规范化错误并且您尝试解析的列不是原子的。 你好 justin,我使用的是 oracle 数据库 11g。我适当地编辑了标签。我正在使用 sql plus 来解决这个问题。 【参考方案1】:

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

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

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

【讨论】:

如何在最后一次出现字符之前获取所有内容(例如,“Hello How Are You?”-->“Hello How Are”) @Growler - 作为一个问题提出来,我相信有人可以帮助你。 对不起。如何在最后一次出现字符之前获取所有内容(例如,“Hello How Are You?”--> “Hello How Are”)? 我的意思是,创建一个 *** 问题,而不是作为评论提出问题。【参考方案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

【讨论】:

电话号码中有字母怎么办?您也可以像 \. 那样转义句点,而不是将其放在字符类中。 @David Faber 没错,转义句可以/会做这项工作,我用数字做到了。关于非数字,我没有在要求中看到/阅读。顺便说一句,很好的答案。 这不是必需的,我怀疑这些天您会看到很多带有字母的电话号码。但总有人可以拥有一个虚荣号码。 ;)【参考方案3】:

你可以在 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 );

【讨论】:

你不需要在字符类中转义.;你可以这样做:[^.] 是的@DavidFaber,你是对的,没有必要。谢谢:) 我倾向于过度逃避自己,以防万一:) 同样的事情发生在我身上:)

以上是关于子字符串,在最后一次出现字符之后?的主要内容,如果未能解决你的问题,请参考以下文章

在第一次出现逗号后返回字符串的子字符串

字符串的常用操作

重复删除子字符串后查找剩余字符串

如何在最后指定的char之后获取子字符串?使用Javascript

查找字符串中子字符串最后一次出现的索引

Bash:从第一次出现字符到第二次出现的子字符串