Вопрос

Я пытаюсь найти наилучший способ удалить нечисловые данные из varchar в SQL, например

'(082) 000-0000' to '0820000000' or
'+2782 000 0000' to '0820000000'

Трудность в том, что я не всегда уверен, какие форматы чисел доступны, как показано выше, поэтому я бы хотел, чтобы все, что не является числом, было существенно удалено.

Обновить:
Судя по тому, что вы, ребята, сказали, это небольшой скачок.:

declare @Num varchar(20)

set @Num = ' + (82) 468 6152 '

--strip nonnumrical data out of @num

print @Num

set @Num = replace(@Num, ' ', '')
set @Num = replace(@Num, '+', '')
set @Num = replace(@Num, '-', '')
set @Num = replace(@Num, '(', '')
set @Num = replace(@Num, ')', '')

print @Num

Однако не удалось правильно получить выражение replace [^ 0-9].

Это было полезно?

Решение

Если вы используете SQL Server 2005 или новее, то лучшим вариантом будет создать определяемая пользователем функция CLR и используйте регулярное выражение для удаления всех нечисловых символов.

Если вы не хотите использовать функцию CLR, вы могли бы создать стандартную пользовательскую функцию.Это сделает свою работу, хотя и не будет столь эффективным:

CREATE FUNCTION dbo.RemoveNonNumerics(@in VARCHAR(255))
RETURNS VARCHAR(255)
AS
BEGIN
    DECLARE @out VARCHAR(255)

    IF (@in IS NOT NULL)
    BEGIN
        SET @out = ''

        WHILE (@in <> '')
        BEGIN
            IF (@in LIKE '[0-9]%')
                SET @out = @out + SUBSTRING(@in, 1, 1)

            SET @in = SUBSTRING(@in, 2, LEN(@in) - 1)
        END
    END

    RETURN(@out)
END

А затем выберите из своей таблицы вот так:

SELECT dbo.RemoveNonNumerics(your_column) AS your_tidy_column
FROM your_table

Другие советы

Взгляните на этот пост (это 8-й пост ниже - первый ДЛИННЫЙ), в котором подробно описывается, как использовать регулярные выражения в SQL Server.Это не самый быстрый способ (это было бы сделано до того, как вы перейдете к SQL), но он обеспечивает достойный способ сделать это.

Для этого существует несколько различных вариантов, в зависимости от вашей СУБД.

Для T-SQL, эта ссылка имеет несколько хороших подходов.

Гораздо проще обрабатывать синтаксический анализ строк на вашем бизнес-уровне.Однако, обнажая, которые используют функцию T-SQL REPLACE() (предполагая MS SQL).

Вы могли бы выполнить цикл с этой функцией для параметра, который был передан, чтобы удалить из него все нечисловые буквы.

Какой тип SQL-бэкенда вы используете?Если существует функция типа regexp_replace, вы могли бы использовать ее для замены [^ 0-9] на nothing .

Наиболее эффективным и гибким, что я нашел, является использование метода numbers / tally table, как показано в ответе мвигдала от 10 марта 2009 года

т. е.разрешенный список намного безопаснее, чем список "не разрешать", который вы указали в нижней части своего вопроса выше.

Чего вы не указали, так это того, как вы обрабатываете нецелые числа ...что вы делаете с десятичными точками?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top