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 return
1234567890`。
接下来,你需要判断上面的第五个字符是否是数字'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