【问题标题】:SQL+ REGEXP + phone_number of all contacts having 5th digit of their phonenumber as '5' using REGEXP_SUBSTR()SQL REGEX + 使用 REGEXP_SUBSTR() 电话号码第 5 位为“5”的所有联系人的电话号码
【发布时间】: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, '^.{4}5')
  • 赋值要求使用 REGEXP_SUBSTR()。编辑器似乎将所有其他方式都标记为错误

标签: sql regex oracle


【解决方案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 怎么样?
猜你喜欢
  • 2011-07-29
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
相关资源
最近更新 更多