Удаление строки между двумя возвратами каретки tsql

Я очень новичок в SQL, поэтому заранее благодарю вас за терпение. У меня есть столбец в таблице, в котором хранится определенный набор инструкций; каждая инструкция заключена в символ возврата каретки.
например: char(13)+ @instruction1 + char(13)...
@Instruction1 — это строка переменной длины, но я знаю определенную часть строки, например: @instruction1 = some string + @knownstring + some string.
Итак, у нас есть char(13) + (some string + @knownstring + some string) +char(13).
Я хочу заменить всю эту строку на ''.
Идентифицируя это, просто используя @knownstring.

Это возможно?

Еще раз спасибо всем, я очень ценю вашу помощь

select replace(replace(column,@knownsting,''),char(13),'') 
from table 
where key=1235

Заменяет только @knownstring, но мне также нужно заменить окружающий текст между двумя char(13)

Не могли бы вы добавить пример и ожидаемый результат? Я не понимаю, что именно нужно сделать.

M. Kanarkowski 28.05.2019 14:27

Версия SSMS значения не имеет. Нам нужно знать версию SQL Server. Если вы не знаете, что это такое, запустите SELECT @@Version и узнайте.

Zohar Peled 28.05.2019 14:27
В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
1
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете попробовать что-то по этому поводу:

DECLARE @KnownString VARCHAR(50)='Keep This'
DECLARE @YourString VARCHAR(MAX)='blah' + CHAR(13) + 'dummy keep this dummy more' + CHAR(13) + 'Something without the known part' + CHAR(13) + 'Again with Keep THIS';

SELECT STUFF(
(
    SELECT CHAR(13) + CASE WHEN CHARINDEX(@KnownString,LineText)>0 THEN @KnownString ELSE LineText END
    FROM (SELECT CAST('<x>' + REPLACE(@YourString,CHAR(13),'</x><x>') + '</x>' AS XML)) A(Casted)
    CROSS APPLY Casted.nodes('/x') B(fragment)
    OUTER APPLY (SELECT fragment.value('text()[1]','nvarchar(max)')) C(LineText)
    FOR XML PATH(''),TYPE
).value('.','nvarchar(max)'),1,1,'');

Результат

blah
Keep This
Something without the known part
Keep This

Идея

Строка преобразуется в XML путем замены разрывов строк тегами XML. Теперь мы можем запрашивать все текстовые строки по отдельности, проверять их на известную строку, выполнять необходимые манипуляции и, наконец, реконкатенировать все фрагменты с помощью XML-трюка (вместе с STUFF, чтобы избавиться от ведущего CHAR(13)).

Примечания

Используя v2016, я бы использовал подход с разделением строк с OPENJSON, а начиная с v2017 есть STRING_AGG(), чтобы упростить повторную конкатенацию.

Большое спасибо, приятель, очень ценю твое элегантное решение!

sypha 29.05.2019 10:01

Другие вопросы по теме