Удаление нечисловых данных из числа + SQL - PullRequest
3 голосов
/ 10 марта 2009

Я пытаюсь найти лучший способ удалить нечисловые данные из 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

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

Ответы [ 6 ]

4 голосов
/ 10 марта 2009

Если вы используете 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
1 голос
/ 10 марта 2009

В зависимости от вашей СУБД для этого есть несколько вариантов.

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

1 голос
/ 10 марта 2009

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

0 голосов
/ 19 января 2011

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

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

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

0 голосов
/ 10 марта 2009

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

0 голосов
/ 10 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...