Как вы можете удалить из строки все символы, которые не являются буквенными?
А как насчет не буквенно-цифровых?
Это должна быть пользовательская функция или есть более обобщенные решения?
Как вы можете удалить из строки все символы, которые не являются буквенными?
А как насчет не буквенно-цифровых?
Это должна быть пользовательская функция или есть более обобщенные решения?
Попробуйте эту функцию:
Create Function [dbo].[RemoveNonAlphaCharacters](@Temp VarChar(1000))
Returns VarChar(1000)
AS
Begin
Declare @KeepValues as varchar(50)
Set @KeepValues = '%[^a-z]%'
While PatIndex(@KeepValues, @Temp) > 0
Set @Temp = Stuff(@Temp, PatIndex(@KeepValues, @Temp), 1, '')
Return @Temp
End
Назовите это так:
Select dbo.RemoveNonAlphaCharacters('abc1234def5678ghi90jkl')
Как только вы поймете код, вы увидите, что его относительно просто изменить, чтобы удалить другие символы. Вы даже можете сделать это достаточно динамичным, чтобы передать ваш шаблон поиска.
Надеюсь, поможет.
Параметризованная версия G Mastros ' удивительный ответ :
Только в алфавитном порядке:
Только числовые:
Только буквенно-цифровой:
Не буквенно-цифровые:
источник
SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9\s')
которые по-прежнему удаляют пробелы. Я также пытался использовать,[[:blank:]]
но это нарушает функцию, и ничего не удаляется из строки. Ближайший Ive получил с помощью:SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^a-z0-9 ')
(жесткое кодирование пробела в шаблоне регулярных выражений). Однако это не удаляет разрывы строк.SELECT dbo.fn_StripCharacters('a1!s2 spaces @d3# f4$', '^ a-z0-9')
Верьте или нет, в моей системе эта уродливая функция работает лучше, чем элегантная G Mastros.
источник
ASCII
здесь целое число и сравниваете напрямую выводSUBSTRING
с некоторыми символами, например:SET @ch=SUBSTRING(@s, @p, 1)
andIF @ch BETWEEN '0' AND '9' OR @ch BETWEEN 'a' AND 'z' OR @ch BETWEEN 'A' AND 'Z' ...
Я знал, что SQL плохо работает со строками, но не думал, что это будет так сложно. Вот простая функция, чтобы вырезать все числа из строки. Там были бы лучшие способы сделать это, но это только начало.
Вывод
Раунд 2 - черный список данных
Вывод
Мой вызов читателям: Можете ли вы сделать это более эффективным? Как насчет использования рекурсии?
источник
Если вы похожи на меня и не имеете доступа просто добавлять функции к своим производственным данным, но все же хотите выполнять такую фильтрацию, вот чистое решение SQL, использующее таблицу PIVOT для повторного объединения отфильтрованных частей.
NB Я жестко закодировал таблицу до 40 символов, вам придется добавить больше, если у вас есть более длинные строки для фильтрации.
источник
Посмотрев на все приведенные решения, я подумал, что должен существовать метод чистого SQL, который не требует функции или запроса CTE / XML и не требует сложного обслуживания вложенных операторов REPLACE. Вот мое решение:
Преимущество такого способа состоит в том, что в подстроке содержатся допустимые символы, что упрощает перенастройку для другого набора символов.
Недостатком является то, что вы должны добавить строку SQL для каждого символа вплоть до размера вашего столбца. Чтобы упростить эту задачу, я просто использовал приведенный ниже скрипт Powershell, например, для VARCHAR (64):
источник
Вот еще один способ удалить не алфавитные символы, используя
iTVF
. Во-первых, вам нужен сплиттер на основе шаблона. Вот один взят из Dwain лагеря статьи :Теперь, когда у вас есть сплиттер на основе шаблона, вам нужно разделить строки, соответствующие шаблону:
а затем объединить их обратно, чтобы получить желаемый результат:
ОБРАЗЕЦ
Результат:
источник
Это решение, основанное на решении г-на Аллена, требует
Numbers
таблицы целых чисел (которая должна быть у вас под рукой, если вы хотите выполнять серьезные операции с запросами с хорошей производительностью). Не требует CTE. Вы можете изменитьNOT IN (...)
выражение, чтобы исключить определенные символы, или изменить его на выражениеIN (...)
ИЛИ,LIKE
чтобы сохранить только определенные символы.источник
Вот решение, которое не требует создания функции или перечисления всех экземпляров символов для замены. Он использует рекурсивный оператор WITH в сочетании с PATINDEX для поиска нежелательных символов. Он заменит все нежелательные символы в столбце - до 100 уникальных плохих символов, содержащихся в любой заданной строке. (Например, «ABC123DEF234» будет содержать 4 неправильных символа 1, 2, 3 и 4). Ограничение 100 - это максимальное количество рекурсий, допустимое в операторе WITH, но это не накладывает ограничения на число обрабатываемых строк, что ограничено только доступной памятью.
Если вам не нужны результаты DISTINCT, вы можете удалить две опции из кода.
источник
Я положил это в обоих местах, где называется PatIndex.
для пользовательской функции выше RemoveNonAlphaCharacters и переименовал ее RemoveNonAlphaNumericCharacters
источник
- Сначала создайте одну функцию
Теперь назовите эту функцию как
Его результат как
источник
С точки зрения производительности я бы использовал встроенную функцию:
источник
Вот еще одно рекурсивное решение CTE, основанное на ответе @Gerhard Weiss здесь . Вы должны быть в состоянии скопировать и вставить весь блок кода в SSMS и поиграть с ним там. Результаты включают несколько дополнительных столбцов, чтобы помочь нам понять, что происходит. Мне потребовалось некоторое время, чтобы понять все, что происходит с PATINDEX (RegEx) и рекурсивным CTE.
источник
Используя таблицу сгенерированных CTE чисел для проверки каждого символа, затем FOR XML для констатации в строку сохраненных значений, которые вы можете ...
источник
источник
этот способ не работал для меня, так как я пытался сохранить арабские буквы, которые я пытался заменить регулярным выражением, но также он не работал. я написал другой метод для работы на уровне ASCII, так как это был мой единственный выбор, и он работал.
ИДТИ
источник
Хотя пост немного устарел, я хотел бы сказать следующее. Проблема, с которой я столкнулся при решении выше, состоит в том, что он не отфильтровывает символы, такие как ç, ë, ï и т. Д. Я адаптировал функцию следующим образом (я использовал только строку из 80 varchar для экономии памяти):
источник
Я только что нашел это встроенным в Oracle 10g, если это то, что вы используете. Мне пришлось убрать все специальные символы для сравнения номера телефона.
источник