Удаление нечисловых данных из числа + SQL
-
08-07-2019 - |
Вопрос
Я пытаюсь найти наилучший способ удалить нечисловые данные из 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 года
т. е.разрешенный список намного безопаснее, чем список "не разрешать", который вы указали в нижней части своего вопроса выше.
Чего вы не указали, так это того, как вы обрабатываете нецелые числа ...что вы делаете с десятичными точками?