我正在使用 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/