#sql-server #tsql #sql-server-2008
#sql-сервер #tsql #sql-server-2008
Вопрос:
Мне нужно обрезать ;
строку внутри T-SQL. Но только если он есть. Как показано ниже :
DECLARE @_tags AS NVARCHAR(MAX);
SET @_tags = 'bla; bla;';
--SELECT TRIMEND(@_tags, ';');
Итак, если @_tags
заканчивается на ;
, ;
будет обрезан. Как я могу это сделать?
Комментарии:
1. Не могли бы вы добавить больше примеров, пожалуйста
Ответ №1:
Чтобы удалить все, если последний символ ;
:
SELECT
CASE
WHEN RIGHT(@_tags, 1) = ';' THEN REPLACE (@_tags, ';', '')
ELSE @_tags
END
Чтобы удалить только конечный:
SELECT
CASE
WHEN RIGHT(@_tags, 1) = ';' THEN STUFF(@_tags, LEN(@_tags), 1, '')
ELSE @_tags
END
Ответ №2:
Решение Gbn лучше, чем это, если в конце строки есть не более одного ;
.
Но если вы хотите удалить произвольное количество ;
, рассмотрите этот запрос:
select case
when patindex('%[^;]%', strCol) = 0 then ''
else substring(strCol, 1,
len(strCol) - patindex('%[^;]%', reverse(strCol)) 1)
end
from YourTable
Шаблон %[^;]%
соответствует любому символу, который не ;
является . Если вы объедините его с reverse
, вы можете искать последнее совпадение вместо первого.
Пример в SE Data.
Ответ №3:
Я хотел бы обобщить ответ gbn. Этот UDF будет обрезать переменную string @TO_TRIM с конца @STRING
CREATE FUNCTION [dbo].[TRIMEND](@STRING NVARCHAR(MAX), @TO_TRIM NVARCHAR(MAX))
RETURNS NVARCHAR(MAX) AS
BEGIN
RETURN
CASE
WHEN @STRING IS NULL THEN NULL
WHEN RIGHT(@STRING, LEN(@TO_TRIM)) = @TO_TRIM THEN STUFF(@STRING, LEN(@STRING) - LEN(@TO_TRIM) 1, LEN(@TO_TRIM), N'')
ELSE @STRING
END
END
Таким образом, вы можете
SELECT [dbo].[TRIMEND](@_tags, ';');