Replace ms sql: REPLACE (Transact-SQL) — SQL Server
Содержание
Поиск информации в тексте средствами MS SQL Server — Разработка на vc.ru
В своей работе нам часто приходится анализировать текст, изложенный в свободной форме (назначения платежей, комментарии, адреса и др.) с целью вычленить определенную информацию. В excel для этого можно использовать текстовые формулы и регулярные выражения VBA. Кроме того, регулярные выражения и текстовые функции можно использовать в python и других языках программирования.
2724
просмотров
Но как быть, если объем информации измеряется миллионами записей в базе данных, а времени на выгрузку и анализ небольших порций данных нет? Использование Transact-SQL (который хоть и не поддерживает регулярные выражения в полной мере, имеет более расширенный функционал оператора like, чем стандартный SQL) позволит переложить вычисления на плечи СУБД и сэкономить время на копировании данных.
Для примера выгрузили отзывы клиентов со страницы www.banki.ru/services/responses/bank/sberbank/ и импортировали данные в MS SQL Server. 0-9]%’
and [Номер телефона] not like ‘[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]’
)
if @t like ‘[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%’
begin
update [dbo].[banki_ru_messages]
set [Номер телефона]=right([Номер телефона], len([Номер телефона])-12)
where [Номер телефона] [email protected]
end
else
begin
update [dbo].[banki_ru_messages]
set [Номер телефона]=right([Номер телефона], len([Номер телефона])-1)
where [Номер телефона] [email protected]
end
end
go
update [dbo].[banki_ru_messages]
set [Номер телефона]=left([Номер телефона], 11)
where [Номер телефона] is not null
go
alter table [dbo].[banki_ru_messages]
alter column [Номер телефона] nvarchar(11)
go
select * from [dbo].[banki_ru_messages]
where [Номер телефона] is not null
Аналогичным способом, изменив количество цифр, можно искать номера счетов, ИНН, почтовые индексы.
Для поиска адресов электронной почты можно воспользоваться следующим кодом:
alter table [dbo]. [banki_ru_messages]
add [E-mail] nvarchar(max)
go
update [dbo].[banki_ru_messages]
set [E-mail]=[Сообщение]
where [Сообщение] like ‘%[A-z0-9]@[A-z0-9]%’
go
declare @t nvarchar(max)
while exists (select top 1 [E-mail] from [dbo].[banki_ru_messages]
where [E-mail] is not null and charindex(‘ ‘, [E-mail])>0)
begin
set @t=(select top 1 [E-mail] from [dbo].[banki_ru_messages]
where [E-mail] is not null and charindex(‘ ‘, [E-mail])>0)
if left(@t, charindex(‘ ‘, @t)-1) like ‘%[A-z0-9]@[A-z0-9]%’
begin
update [dbo].[banki_ru_messages]
set [E-mail]=left(@t, charindex(‘ ‘, @t)-1)
where [E-mail][email protected]
end
else
begin
update [dbo].[banki_ru_messages]
set [E-mail]=right(@t, len(@t)-charindex(‘ ‘, @t)+1)
where [E-mail][email protected]
end
end
go
select * from [dbo].[banki_ru_messages]
where [E-mail] is not null or [ИНН] is not null or [Номер телефона] is not null
Описанные алгоритмы конечно же имеют погрешность (количество подряд идущих цифр не всегда однозначно определяет их суть, да и символ «@» встречается не только в адресах электронной почты), но в определенных ситуациях позволяют сэкономить время и дать представление о наличии и объеме искомой информации в текстовых полях.
Использование функции SQL REPLACE и примеры
Автор: Daniel Calbimonte
Функция REPLACE SQL используется для замены строки или подстроки строки
с другой строкой в
T-SQL
сценарий,
оператор ВЫБОР,
ОБНОВЛЯТЬ
оператор, запрос SQL или
хранимая процедура в базе данных Microsoft SQL.
Синтаксис
REPLACE(выражение, stringToReplace, stringReplacement)
Параметры
- выражение — Исходная строка или
выражение, которое нужно заменить полностью или частично, это может быть varchar, nvarchar
или двоичные типы данных. - stringToReplace — Заменяемое строковое значение, можно
быть varchar, nvarchar или двоичными типами данных. - stringReplacement — Замена строки, может
быть varchar, nvarchar или двоичными типами данных.
Пример простой функции SQL REPLACE
В следующем примере слово «Мир» заменяется на «MSSQLTIPS».
создать новую строку.
SELECT REPLACE('Hello World','World','MSSQLTIPS') в качестве вывода
Значения NULL в функции SQL REPLACE
Если некоторые из аргументов имеют значение NULL, выходные данные будут равны NULL. Чтобы заменить значения NULL,
вместо этого вам нужно будет использовать функцию ISNULL.
SELECT REPLACE(NULL,NULL,'None') в качестве вывода
Удаление слова с помощью функции SQL REPLACE
В следующем примере будет удалено слово «World» из «Hello World».
SELECT REPLACE('Hello World','World','') в качестве вывода
Использовать SQL REPLACE с числовыми значениями
В следующем примере показано, что с помощью этой функции можно заменить числовые числа.
В этом примере цифра 1 заменена на 5.
ВЫБЕРИТЕ ЗАМЕНУ (11112233,1,5) в качестве вывода
Работа с параметрами сортировки и функцией SQL REPLACE
В следующем примере слово «Мир» заменяется коллекцией «Albanan_BIN».
сопоставления и заменяется пустой строкой.
SELECT REPLACE('Hello World' COLLATEAlbanan_BIN ,'World','') в качестве вывода
Чтобы получить список доступных сопоставлений (с учетом регистра и без учета регистра), используйте следующий запрос.
ВЫБЕРИТЕ Имя, Описание ИЗ fn_helpcollations()
Использование функции SQL REPLACE с таблицей и столбцом
В следующем примере открывающая скобка заменяется дефисом, а
закрыть скобку дефисом. Итак, мы вкладываем 2 вызова REPLACE вместе следующим образом.
SELECT REPLACE(REPLACE(PhoneNumber,'(','-'), ')','-') как замененный, PhoneNumber ОТ [Person].[PersonPhone]
Использование функции SQL REPLACE для замены нескольких пробелов одним пробелом
В этом примере мы заменим несколько пробелов одним пробелом.
Опять же, мы используем вложенные операторы REPLACE. Код ниже преобразует
пробелы в квадратные скобки, а затем обратно в один пробел.
SELECT REPLACE(REPLACE(REPLACE('это пример с несколькими пробелами',' ','[]'),'][',''),'[]',' ') as msg
Вот как это можно записать. Aa-Zz]%’,@string),1),»)
КОНЕЦ
ВОЗВРАТ
КОНЕЦ
Далее мы используем функцию следующим образом.
SELECT [dbo].[ufnGetLetters]('122S&*%LFJLDkld;lfs34') как сообщение
Связанные команды SQL и руководства
ЗАМЕНА
Использование функции SQL ISNULL()
Обзор параметров сортировки SQL Server и примеры
Выбор между COALESCE и ISNULL в SQL Server
Множество вариантов использования Coalesce в SQL Server
Как использовать SQL Server Coalesce для работы со значениями NULL
Функция CONCAT и CONCAT_WS в SQL Server
Несколько способов объединения значений вместе в SQL Server
- Начало работы с SQL INNER JOIN
SQL INNER JOIN, LEFT JOIN и RIGHT JOINПримеры
- Учебное пособие по строковым функциям SQL
СТР
- ПАТИНДЕКС SQL
- SQL ПОДСТРОКА
Функция SQL COALESCE
SQL CONCAT
SQL
SQL-сервера
сервер sql — альтернативное решение для REPLACE() в столбце 9 ntext0001
Обзор
У меня есть база данных изображений, в которой хранится информация о снимках, сделанных камерами. База данных содержит таблицу изображений
, которая имеет 256 столбцов, содержащих информацию о снятом изображении.
Один столбец Комментарии
имеют формат ntext
и содержат CR/LF.
Еще 21 столбец настроен как ntext
.
Я извлекаю данные из базы данных в плоский файл, используя Задачи | Экспорт данных... Функция
найдена в SSMS. Затем экспортированные данные передаются внешним партнером в новую систему, которая будет использоваться в ближайшем будущем. Файл экспорта (CSV) содержит около 256 столбцов, из которых 21 столбец может содержать CR/LF.
Проблема
Поле/столбец Комментарии
содержит многочисленные CR/LF (SQL: CHAR(13)
, CHAR(10)
), что влияет на анализ данных.
Я пытался использовать ЗАМЕНИТЬ(выражение, значение, значение)
для поиска CR/LF и замены его на @@
и думал реализовать это во время экспорта с помощью Экспорт данных
в SSMS.
Однако функция REPLACE()
возвращает
Сообщение 8116, уровень 16, состояние 1, строка 4
Тип данных аргумента ntext недопустим для аргумента 1 функции замены.
… когда я выполняю что-то вроде:
SELECT 'Start *******************', REPLACE(Comment,' ','@@'), ID, '*********************End' FROM dbo.pictures ГДЕ комментарий НРАВИТСЯ '% %';
Демонстрация данных из комментария к столбцу
Выдача следующего оператора:
SELECT Comment FROM dbo.Pictures ГДЕ Комментировать как '% %';
…получит следующий образец Комментарий
запись:
Zwei Fotos von Arenenberg auf einer Seite einer englischen Zeitschrift. Seite 148 der Zeitung "The Graphic" vom 4. Август 1906 г. = Новости из-за границы. «Последняя сцена из всех»: на прошлой неделе открылся ретрит для пожилых актеров недалеко от Мо во Франции. 1. Общий вид дома 2. М. Коклен читает в театре под открытым небом Замок Арененберг, подаренный императрицей Евгенией кантону Тургови. 3. Вид из замка [Арененберг] на Боденское озеро. 4. Замок Арененберг Императрица Евгения подарила швейцарскому кантону Тургови исторический замок Арененберг, где жил Наполеон III. прошли несколько лет его юности. Королева Гортензия после падения первой Империи бежала в Швейцарию и в 1817 году приобрела замок, восхитительно расположенный на берегу Боденского озера. Подарок включает в себя бесценную коллекцию картин, рукописей, книг, старой мебели и гобеленов, среди наиболее важных сувениров - раскладушка Наполеона III и карета, в которой он покинул Седан после своего поражения. Когда изменения будут завершены, замок будет открыт для публики. 5. Первый полет нового летательного аппарата Сантос-Дюмон. 6. Зал в Выборге, где заседала распущенная Дума. .
Да, есть пустая строка. Точка была вставлена мной для отображения длины текста.
Регулярные выражения
Я экспортировал данные, а затем выполнил различные регулярные выражения, чтобы исключить CR/LF из данных. Поскольку столбец Комментарий
находится в середине данных, мне пришлось попробовать различные строки регулярных выражений:
Строки поиска
([a-zA-Z0-9/,.@():;\s]+) (\r\n)([a-zA-Z0-9/,.@():;"\s]+) ([a-zA-Z0-9/,.@():;\s]+)(\r\n\r\n)([a-zA-Z0-9/,.@():;"\s]+) ([a-zA-Z0-9/,.@():;\s]+)(\r\n\r\n\r\n)([a-zA-Z0-9/,.@( ):;"\s]+) ([a-zA-Z0-9/,.@():;\s]+)(\r\n\r\n\r\n\r\n)([a-zA-Z0-9/ ,.@():;"\s]+) ([\w/,.@():;\s']+)(\r\n)([\w/,.@():;"\s]+) (;")(\r\n)(";) (;")(\r\n)([\w/,.@():;\s']+) (\w")(\r\n)([\w/,.@():;\s']+)
Заменить
\1@@\3
Это решение не было ни эффективным, ни действенным, так как на приведение в порядок CSV-файла уходило несколько прогонов и часов.
Вопрос
Как заменить CR/LF в столбец ntext
с @@
во время экспорта в плоский файл CSV? Есть ли вариант, отличный от REPLACE
, который я мог бы использовать?
Ограничения/замечания
- Службы Integration Services не установлены, поэтому это не вариант.