SQL REGEX + 使用 REGEXP_SUBSTR() 电话号码第 5 位为“5”的所有联系人的电话号码

Posted

技术标签:

【中文标题】SQL REGEX + 使用 REGEXP_SUBSTR() 电话号码第 5 位为“5”的所有联系人的电话号码【英文标题】:SQL+ REGEXP + phone_number of all contacts having 5th digit of their phonenumber as '5' using REGEXP_SUBSTR() 【发布时间】:2018-04-17 00:38:48 【问题描述】:

编写查询以显示电话号码第 5 位为“5”的所有联系人的名字、城市、州和电话号码。根据 first_name 以升序显示记录。 注意:使用 REGEXP_SUBSTR()。

我需要有关如何使用正则表达式检查第 5 个字符是否为 5 的帮助 这是我目前所拥有的:

SELECT first_name, city, state, phone_number
FROM contact 
WHERE REGEXP_SUBSTR(phone_number, '^([[:digit:]]4)([[:digit:]]1)([[:digit:]]4)',\1\2\3)
ORDDER BY first_name ASC;

【问题讨论】:

欢迎来到 SO。请花点时间阅读How to Ask。这不是私人编码服务。如果您希望有人帮助您,请付出一些努力和minimal reproducible example 为什么是 regexp_substr?旨在匹配模式的 regexp_like 在这里似乎更合适:where regexp_like(phone_number, '^.45') 赋值要求使用 REGEXP_SUBSTR()。编辑器似乎将所有其他方式都标记为错误 【参考方案1】:

这里有两个问题。首先,您需要从电话号码中删除除数字以外的所有内容。其次,您需要确定剩余数字的第五位是否为'5'。

要删除所有可以使用的非数字字符

REGEXP_REPLACE(PHONE_NUMBER, '[^0-9]', '')

例如,如果您的电话号码是(123)456-7890' the above will return1234567890`。

接下来,你需要判断上面的第五个字符是否是数字'5'。现在,简单的方法是使用

SUBSTR(phone#, 5, 1) = '5'

但我们当然不能以简单的方式做事。要使用 REGEXP_SUBSTR 执行此操作,您将使用

'5' = REGEXP_SUBSTR(phone#, '^([0-9]4)(5)([0-9]5)$', 1, 1, 'i', 2)

因此,将上述内容与您的查询结合起来,我们得到

SELECT first_name, city, state, phone_number
  FROM contact 
  WHERE '5' = REGEXP_SUBSTR(REGEXP_REPLACE(PHONE_NUMBER, '[^0-9]', ''),
                              '^([0-9]4)(5)([0-9]5)$', 1, 1, 'i', 2)
  ORDER BY FIRST_NAME ASC

SQLFiddle here

祝你好运。

【讨论】:

非常感谢!这有助于我理解正则表达式 - 在线提供的材料非常令人困惑【参考方案2】:

从联系人中选择名字、城市、州、电话号码 其中 SUBSTR(phone_number, 5, 1) = '5' order by first_name asc;

【讨论】:

使用 REGEXP_SUBSTR 怎么样?

以上是关于SQL REGEX + 使用 REGEXP_SUBSTR() 电话号码第 5 位为“5”的所有联系人的电话号码的主要内容,如果未能解决你的问题,请参考以下文章

Spark-SQL 是不是支持使用 regex 规范的 Hive Select All Query with except Columns

SQL - REGEX 如果它有一个@符号,则匹配整个单词

RegEx SQL,发出转义引号

使用Spark SQL中的regex函数从字符串中提取特定数字

在 SQL Server 中使用正则表达式

SQL REGEX 搜索表名