Sql 搜索不同格式的电话号码
我们有一张储存电话号码的桌子。这些数字存储在Sql 搜索不同格式的电话号码,sql,sql-server,Sql,Sql Server,我们有一张储存电话号码的桌子。这些数字存储在VARCHAR(200)中。但格式不同,例如: 040-1551515 (073) 614 53 97 +31884637222 我想搜索这个表的非数字字符串。因此,如果我的搜索值是“0736145397”,它将与“(073)614 53 97”匹配。这可能吗 理想情况下,我们最好将它们全部转换为一种格式,但这不会很快发生。虽然不兼容,但您可以使用REPLACE从WHERE子句中的电话号码列中删除字符,如下所示: CREATE TABLE #Demo
VARCHAR(200)
中。但格式不同,例如:
040-1551515
(073) 614 53 97
+31884637222
我想搜索这个表的非数字字符串。因此,如果我的搜索值是“0736145397
”,它将与“(073)614 53 97
”匹配。这可能吗
理想情况下,我们最好将它们全部转换为一种格式,但这不会很快发生。虽然不兼容,但您可以使用
REPLACE
从WHERE
子句中的电话号码列中删除字符,如下所示:
CREATE TABLE #DemoTable (number VARCHAR(200))
INSERT INTO #DemoTable (number) VALUES ('040-1551515'), ('(073) 614 53 97'), ('+31884637222')
SELECT *
FROM #DemoTable
WHERE (REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(number, '-', ''), '+', ''), ' ', ''), '(', ''), ')', '') = '0736145397')
DROP TABLE #DemoTable
您需要为要删除的每个字符添加一个新的REPLACE
正如我所说的,InIgant,但是如果您只有几个字符要排除,那么这就可以了。选择试试这个
select phon_no from table
where replace(replace(replace(replace(phone_no,' ',''),'(',''),')',''),'+','')='0736145397'
但是,您可以使用另一列,该列包含没有格式的电话号码,以便您可以使用该列进行搜索您可以大量使用replace()
来解决此问题:
where replace(replace(replace(replace(replace(tnumber, ' ', ''
), '(', ''
), ')', ''
), '-', ''
), '+', ''
) = '0736145397'
如果不能更改数据本身,可以考虑将“清除”的数字添加为计算列。比如:
alter table t add CleanNumber as (
replace(replace(replace(replace(replace(tnumber, ' ', ''
), '(', ''
), ')', ''
), '-', ''
), '+', ''
) )
那么查询将是:
where CleanNumber = '0736145397'
我们可以为它替换函数
创建表phonenumber(number varchar(200))
插入电话号码值('123456')
插入电话号码值(“+555555”)
插入电话号码值('77(123)989')
从phonenumber和(nolock)中选择replace(替换(编号“(”,“)”,“)FormattedNumber,*)
其中replace(replace(number,“(”,“,”)”,“)=”77123989“
在插入/更新时使用触发器格式化数字,搜索将变得更容易。(在此之前,请创建一个以所需格式返回数字的函数,在比较数字时使用该函数。您可以稍后在创建触发器时重新使用该函数。)在此处使用UDF:withwhere dbo.fnRemovePatternFromString(电话号码,“%[^0-9]”)='0123456'
或更好地使用计算列/触发器,使用UDF或客户端逻辑添加规范化的数字。根据这一点,您可能可以使用'where phoneNumber,如[number go here]。如果不是,则可能patindex函数更合适。