存储只有号码和“x”的电话号码用于分机?

时间:2012-03-13 19:39:28

标签: sql regex sql-server-2005 phone-number

我有一个测试功能,可以清理手机号码,只允许存储nos和字符“x”或“X”。除了它允许我不想要的多个x之外,我还有其中的大部分功能。任何人都可以帮助我将它添加到正则表达式中,如果发现潜在问题也可以告诉我吗?

CREATE Function [dbo].[RemoveAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin

    While PatIndex('%[^0-9,x,X]%', @Temp) > 0
        Set @Temp = Stuff(@Temp, PatIndex('%[^0-9,x,X]%', @Temp), 1, '')

    Return @TEmp
End

1 个答案:

答案 0 :(得分:2)

这里PATINDEX的问题在于它无法真正确定模式在第一次遇到字符串后应该发生变化。所以也许这种方法会更简单:

CREATE FUNCTION [dbo].[RemoveAlphaCharacters]
(
    @Temp VARCHAR(1000)
)
RETURNS VARCHAR(1000)
AS
BEGIN
    DECLARE @i INT, @hitX BIT, @t VARCHAR(1000), @c CHAR(1);

    SELECT @i = 1, @hitX = 0, @t = '';

    WHILE @i <= LEN(@Temp)
    BEGIN
        SET @c = SUBSTRING(@Temp, @i, 1);
        IF LOWER(@c) = 'x' AND @hitX = 0
        BEGIN
            SET @t = @t + @c;
            SET @hitX = 1;
        END
        IF @c LIKE '[0-9]'
        BEGIN
            SET @t = @t + @c;
        END 

        SET @i = @i + 1;
    END
    RETURN(@t);
END
GO

SELECT dbo.RemoveAlphaCharacters('401-867-9092');
SELECT dbo.RemoveAlphaCharacters('401-867-9092x32');
SELECT dbo.RemoveAlphaCharacters('401-867-9092x32x54');

结果:

4018679092
4018679092x32
4018679092x3254