我当前的MSSQL表有一个“phone”列,它是一个varchar。不幸的是,数据库中已有的电话号码不是标准格式。例如,888-888-8888或888/888/8888 OR(888)8888888或8888888888。
我希望获得相当于88888888的所有行,即它应该与888-888-8888,(888)888888等相匹配。
我尝试过使用REPLACE(),但是某些行中的条目有其他字母字符,如“e”,“ex”,“ext”等。所以我想替换所有非数字字符。
使用MSSQL查询获取“匹配”行的最佳方法是什么?
答案 0 :(得分:2)
您可以尝试此功能(MS SQL Server):
CREATE FUNCTION uf_RemoveNotNumbers (@str varchar(max))
RETURNS varchar(max)
AS
BEGIN
WHILE @str LIKE '%[^0-9]%'
SET @str=replace(@str, substring(@str, patindex('%[^0-9]%',@str),1),'');
RETURN @str
END
GO
DECLARE @str varchar(max);
SET @str = 'q56--89+9*67qweresr';
select dbo.uf_RemoveNotNumbers (@str)
答案 1 :(得分:1)
使用MySQL的简单版本:
SELECT * FROM `phones` WHERE `phone` LIKE '%8%8%8%8%8%8%8%8%8%8%'
使用PHP:
// Get all your table rows into $rows using SELECT ..
foreach ($rows as $row) {
$row['phone'] = preg_replace('/\D/', '', $row['phone'];
// Save the row using UPDATE ..
}
正则表达式\D
匹配任何非数字字符。有关详细信息,请参阅php.net/preg_replace。
如果您只想找到符合“8888888888”的行,那么您可以使用:
if (preg_match('/\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*8\D*/', $row['phone'])) {
..
}
可以简化/摘要:
$match = '8888888888';
if (preg_match('/' . preg_replace('/(\d)/', '\D*$1', $match) . '\D*/', $row['phone'])) {
..
}
答案 2 :(得分:0)
为什么不写一个可以为你做的PHP脚本?
离。得到所有行 - >替换 - >更新
答案 3 :(得分:0)
继承了可能适用于MSSQL的查询。
create FUNCTION dbo.Only_Numbers
(
@string VARCHAR(8000)
)
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @IncorrectCharLoc SMALLINT
SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
WHILE @IncorrectCharLoc > 0
BEGIN
SET @string = STUFF(@string, @IncorrectCharLoc, 1, '')
SET @IncorrectCharLoc = PATINDEX('%[^0-9]%', @string)
END
SET @string = @string
Return @string
END
GO
select dbo.Only_Numbers('888*88-88/2')
答案 4 :(得分:0)
您可以尝试以下代码:
$query="select * from tablename";
$result=mysql_query($query);
while($row=mysql_fetch_array($result))
{
$str = preg_replace('[\D]', '', $row['phone']);
}