sql - SQL中如何获取所有不包含特定2个字符的字段?

标签 sql sql-server database

我正在使用 sqlplus,我想在 SQL 中提取除 [0-9, '-','+', '(',')',' '] 之外的任何字符的所有联系电话?这个我试过了

select VOICE from MERCHANT_MP_CONTACTS where (VOICE not like '%[0-9]%')
select VOICE from MERCHANT_MP_CONTACTS where (VOICE not like '%-%')
select VOICE from MERCHANT_MP_CONTACTS where (VOICE not like '%+%')..

例子:

预期输出

因为我是第一次使用sql所以我不能结合这些条件,谁能帮我解决这个问题?

最佳答案

演示:http://rextester.com/PECYN79110

isnumeric 确保剩余的值都是 0-9。替换消除了我们希望允许有效的字符。

with cte (Voice) as (
 SELECT '+65 8131 6259' union all
 SELECT '+64-21-126-0024' union all
 SELECT '+66 955940641??' union all
 SELECT '+abc' union all
 SELECT '+651234'union all
 SELECT '+1(555) 555-5555')

SELECT cte.*
FROM cte
WHERE isnumeric(replace(
                replace(
                replace(
                replace(
                replace(voice,' ','')  --Eliminate spaces
                             ,')','')  --Eliminate )
                             ,'(','')  --Eliminate (
                             ,'-','')  --Eliminate -
                             ,'+','')  --Eliminate +
               ) = 0                   --show only those not numeric remaining.

由于字符串操作,不会很快;因此没有索引使用。但是,您可以使用 where 子句表达式创建一个计算列,然后您可以只使用 1 或 0 引用计算列 isValidVoice。我们将性能成本放在数据保存上,而不是后续查询上。因此,如果读取性能是一个问题;但是保存性能可以多等几分之一秒,然后你可以获得更好的性能。

或者,您可以将 where 子句设为传入语音的函数,如果它是基于您的规则的 isValidPhoneNumber,它就会简单地返回。这样该功能可以在多个地方使用;或作为多个列/表的计算列;但那样也会更慢。

关于sql - SQL中如何获取所有不包含特定2个字符的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46667714/

相关文章:

.net - 当数据库离线时,您如何管理您的应用程序?

php - 谷歌应用程序引擎[PHP] : Error trying to establish database connection

java - Java程序输出错误的数据库记录数

sql - 从 SQL 中的同一个表链接后续患者访问

sql-server - SQL 错误 : The multi-part identifier . .. 无法绑定(bind)

sql-server - "DBCC CHECKDB (databasename, repair)"是哪种类型的修复级别?

javascript - 使用每个数组的对象键将嵌套数组递归转换为嵌套对象

sql - 我们可以在子查询中使用 LIKE 而不是 IN

php - 根据搜索查询从数据库返回行

sql - Select 语句中的日期减法