Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 搜索不同格式的电话号码_Sql_Sql Server - Fatal编程技术网

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:with
where dbo.fnRemovePatternFromString(电话号码,“%[^0-9]”)='0123456'
或更好地使用计算列/触发器,使用UDF或客户端逻辑添加规范化的数字。根据这一点,您可能可以使用'where phoneNumber,如[number go here]。如果不是,则可能patindex函数更合适。