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

时间:2017-10-10 13:14:42

标签: sql sql-server database

我正在使用sqlplus,我想提取所有包含除[0-9,' - ',' +',' ('&#39)',' ']在SQL中?我试过这个

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 '%+%')..

示例:

+65 8131 6259
+64-21-126-0024
+66 955940641??
+abc
+651234

预期输出

+66 955940641??
+abc

由于我是第一次使用sql所以我无法结合这些条件,有人可以帮我这个吗?

3 个答案:

答案 0 :(得分:1)

您可能需要以下内容,在这里您可以使用 UNION

将所有三个不喜欢的条件合并为一个
index

答案 1 :(得分:1)

演示: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,它就会返回。这样,该功能可以在多个地方使用;或作为多列/表的计算列;但那也会慢一些。

答案 2 :(得分:0)

你可以试试这个。

select VOICE from MERCHANT_MP_CONTACTS WHERE (REPLACE(VOICE,' ','') like '%[^0-9+-]%')

结果:

VOICE
---------------
+66 955940641??
+abc