用空字符串替换MSSQL中的所有非数字字符

时间:2011-09-23 03:16:40

标签: php sql sql-server

我当前的MSSQL表有一个“phone”列,它是一个varchar。不幸的是,数据库中已有的电话号码不是标准格式。例如,888-888-8888或888/888/8888 OR(888)8888888或8888888888。

我希望获得相当于88888888的所有行,即它应该与888-888-8888,(888)888888等相匹配。

我尝试过使用REPLACE(),但是某些行中的条目有其他字母字符,如“e”,“ex”,“ext”等。所以我想替换所有非数字字符。

使用MSSQL查询获取“匹配”行的最佳方法是什么?

5 个答案:

答案 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']);
}