我正在使用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所以我无法结合这些条件,有人可以帮我这个吗?
答案 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