T sql replace: REPLACE (Transact-SQL) — SQL Server
Содержание
sql server — Transact SQL заменяет часть строки
спросил
Изменено
8 лет, 10 месяцев назад
Просмотрено
4к раз
Можно ли удалить часть строки с помощью регулярного выражения (или чего-то еще, может помочь что-то вроде CHARINDEX) в SQL-запросе?
Я использую MS SQL Server (скорее всего 2008 года).
Пример:
У меня есть такие строки, как « [некоторая бесполезная информация] Полезная часть строки » Я хочу удалить части с текстом в скобках, если они находятся в строке.
- sql
- sql-server
- tsql
Использовать REPLACE
например:
ОБНОВЛЕНИЕ авторов SET city = replace(город, 'Удалить', 'ЧЕРНЫМ или любым другим') ГДЕ город НРАВИТСЯ «Соль%»; // с условием где
Вы можете использовать функцию PATINDEX. Это не полная реализация регулярных выражений, но вы можете использовать ее для простых вещей.
PATINDEX (Transact-SQL) > Возвращает начальную позицию первого появления шаблона в указанном выражении или нули, если шаблон не найден, для всех допустимых текстовых и символьных типов данных.
ИЛИ Вы можете использовать CLR для расширения SQL Server полной реализацией регулярных выражений.
- SQL Server 2005: интеграция со средой CLR
SELECT * FROM temp где replace(replace(replace(url,'http://',''),'www.',''),'https://','')='"+url+ ';
Вы можете использовать STUFF, чтобы вставить строку в другую строку. Он удаляет указанную длину символов в первой строке в начальной позиции, а затем вставляет вторую строку в первую строку в начальной позиции.
Например, код ниже заменяет 5
на 666666
:
DECLARE @Variable NVARCHAR(MAX) = '12345678910' ВЫБЕРИТЕ МАТЕРИАЛ(@Variable, 5, 1, '666666')
Обратите внимание, что второй аргумент не является строкой, это позиция
, и вы можете рассчитать ее позицию, например, с помощью CHARINDEX.
Вот ваш случай:
DECLARE @Variable NVARCHAR(MAX) = '[некоторая бесполезная информация] Полезная часть строки' ВЫБЕРИТЕ МАТЕРИАЛ( @Переменная ,CHARINDEX('[', @Переменная) ,LEN(SUBSTRING(@Variable, CHARINDEX('[', @Variable), CHARINDEX(']', @Variable) - LEN(SUBSTRING(@Variable, 0, CHARINDEX('[', @Variable))))) ,'' )
Наконец помогает REPLACE, SUBSTRING и PATINDEX.
REPLACE(t.badString, Substring(t.badString, Patindex('%[%', t.badString)+1, Patindex('%]%', t.badString)), '').
Всем спасибо.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.
T-SQL, вторник #080: СОЗДАЙТЕ ИЛИ ЗАМЕНИТЕ
В этом месяце T-SQL вторник, 80-е мероприятие, проводит Крис Йейтс (блог | @YatesSQL). Сегодня у него день рождения, поэтому он подошел к теме с идеями о подарках.
У него было несколько предложений для наших постов, и одно, которое мне понравилось, касалось функций, которые, как мы хотели, не отсутствовали в SQL Server:
Возможно, есть функция, которую вы хотели бы добавить в SQL, но которой еще нет — что это?
Хотя я чувствую, что исчерпал свой список пожеланий в T-SQL за последний месяц, вторник , я, вероятно, справился бы с этим, если бы это была тема каждый месяц, потому что есть много вещей, которые я хотел бы видеть добавленными на нашу любимую платформу базы данных.
Тем не менее, один конкретный запрос функции (который был повторно активизирован, когда SQL Server 2016 добавил DROP IF EXISTS
), несомненно, более полезен CREATE OR REPLACE
.
DROP IF EXISTS
может быть очень полезным, когда вы просто хотите написать простую CREATE PROCEDURE
, например, и отбросить все, что существовало ранее. В прошлом мы делали это так: проверяли существование объекта, удаляли его, если он существует (для чего в некоторых случаях может потребоваться динамический SQL), а затем создавали заново:
IF EXISTS ( ВЫБЕРИТЕ 1 ИЗ системных процедур ГДЕ [идентификатор_схемы] = 1 И имя = N'MyProcedure' ) НАЧИНАТЬ ПРОЦЕДУРА УДАЛЕНИЯ dbo.MyProcedure; КОНЕЦ ИДТИ СОЗДАТЬ ПРОЦЕДУРУ dbo.MyProcedure КАК -- ... хороший материал ...
С DROP IF EXISTS
теперь я могу сделать это немного менее неловко, без проверки IF
и без необходимости динамического SQL:
DROP IF EXISTS PROCEDURE dbo.MyProcedure; ИДТИ СОЗДАТЬ ПРОЦЕДУРУ dbo.MyProcedure КАК -- ... хороший материал ...
DROP IF EXISTS
, безусловно, чище, как с точки зрения логики, так и с точки зрения размера кода. Обратите внимание, однако, что DROP IF EXISTS
может «сбой», скрывая другую проблему, связанную с разрешениями .
Говоря о разрешениях…
УДАЛИТЬ, ЕСЛИ СУЩЕСТВУЕТ
, не решает основную проблему со всеми вышеперечисленными подходами: разрешения. Если я настроил сложные разрешения для объекта, я не хочу просто выбрасывать их и создавать с нуля. Так что люди делают сейчас? Ну, как правило, в противоположность вышесказанному, они либо записывают условный CREATE
, либо ALTER
, что должно быть выполнено в динамическом SQL (потому что CREATE
или ALTER PROCEDURE
должен быть в отдельном пакете):
DECLARE @sql nvarchar(max) = N' PROCEDURE dbo.MyProcedure КАК -- ... хороший материал ...'; ЕСЛИ СУЩЕСТВУЕТ ( ВЫБЕРИТЕ 1 ИЗ sys.procedures... ) НАЧИНАТЬ -- ИЗМЕНИМ, чтобы не потерять разрешения SET @sql = N'ALTER ' + @sql; EXEC sys.sp_executesql @sql; КОНЕЦ ЕЩЕ НАЧИНАТЬ -- не существует, давайте создадим его: SET @sql = N'CREATE ' + @sql; EXEC sys. sp_executesql @sql; END
Или что-нибудь поумнее: создать пустую оболочку процедуры, если она еще не существует, и сразу перейти к ИЗМЕНИТЬ
, если да. Это позволяет модифицировать тело процедуры и поддерживать его в системе управления версиями без осложнений динамического SQL:
IF NOT EXISTS ( ВЫБЕРИТЕ 1 ИЗ sys.procedures... ) НАЧИНАТЬ -- создать тень процедуры EXEC sys.sp_executesql N'СОЗДАТЬ ПРОЦЕДУРУ dbo.MyProcedure AS PRINT 1;'; КОНЕЦ ИДТИ ИЗМЕНИТЬ ПРОЦЕДУРУ dbo.MyProcedure КАК -- ... хорошая штука...
Это решает проблему, но не очень аккуратно, и требует, чтобы тело процедуры сопровождалось дополнительными формами в системе управления версиями (или там, где вы храните сценарии базы данных, потому что Вы где-то храните свои скрипты базы данных, верно? :-)).
Что было бы бомбой…
Да, я, наверное, уже устарел, но окончательным решением был бы встроенный синтаксис, похожий на DROP IF EXISTS
, который создает процедуру, если она еще не существует, и изменяет его, если это так:
CREATE_OR_ALTER PROCEDURE dbo. MyProcedure КАК -- ... хороший материал ...
Это упростило бы развертывание этих объектов, предотвратило нарушение разрешений и сделало бы единую автономную инструкцию, которая могла бы храниться в системе управления версиями и не требовала бы каких-либо дополнительных действий. обработка или динамический SQL. Хотели бы вы увидеть это в T-SQL? Ладно, иди голосуй и комментарий !
- #344991 : Оператор CREATE OR ALTER
Я пытался продвигать эту идею шесть лет назад , хотя то конкретное предложение, на которое я указал, было заметено под ковер. Кроме того, еще в 2008 году Microsoft заявила: « Эта функция находится в верхней части нашего списка задач для предстоящего выпуска ». Интересно, что вообще случилось с этим списком дел?
Конечно, это не имело бы большого смысла для немодульных объектов, таких как таблицы, поскольку их DDL намного сложнее и часто не может быть выполнен в одном операторе.