SQL Server T-КОНЕЦ ОБРЕЗКИ SQL

#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, ';');