Я очень новичок в 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)
Версия SSMS значения не имеет. Нам нужно знать версию SQL Server. Если вы не знаете, что это такое, запустите SELECT @@Version
и узнайте.
Вы можете попробовать что-то по этому поводу:
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()
, чтобы упростить повторную конкатенацию.
Большое спасибо, приятель, очень ценю твое элегантное решение!
Не могли бы вы добавить пример и ожидаемый результат? Я не понимаю, что именно нужно сделать.