Символ SQL Server TRIM - PullRequest
       18

Символ SQL Server TRIM

13 голосов
/ 20 октября 2011

У меня есть следующая строка: 'BOB *', как мне обрезать *, чтобы он отображался как 'BOB'

Я пробовал RTRIM ('BOB *', '*'), но нене работает, как говорит, нужен только 1 параметр.

Ответы [ 15 ]

21 голосов
/ 01 февраля 2013

Еще один довольно хороший способ реализации Oracle TRIM char FROM string в MS SQL Server заключается в следующем:

  • Во-первых, вам нужно определить символ, который никогда не будет использоваться в вашей строке, например ~
  • Вы заменяете все пробелы этим символом
  • Вы заменяете символ *, который хотите обрезать пробелом
  • Вы LTrim + RTrim Полученная строка
  • Вы заменяете обратно все пробелы урезанным символом *
  • Вы заменяете обратно все никогда не используемые символы пробелом

Например:

REPLACE(REPLACE(LTrim(RTrim(REPLACE(REPLACE(string,' ','~'),'*',' '))),' ','*'),'~',' ')
16 голосов
/ 06 декабря 2013
CREATE FUNCTION dbo.TrimCharacter
(
    @Value NVARCHAR(4000),
    @CharacterToTrim NVARCHAR(1)
)
RETURNS NVARCHAR(4000)
AS
BEGIN
    SET @Value = LTRIM(RTRIM(@Value))
    SET @Value = REVERSE(SUBSTRING(@Value, PATINDEX('%[^'+@CharacterToTrim+']%', @Value), LEN(@Value)))
    SET @Value = REVERSE(SUBSTRING(@Value, PATINDEX('%[^'+@CharacterToTrim+']%', @Value), LEN(@Value)))
    RETURN @Value
END
GO
--- Example
----- SELECT dbo.TrimCharacter('***BOB*********', '*')
----- returns 'BOB'
10 голосов
/ 20 февраля 2014

Если вы хотите удалить все звездочки, то это очевидно:

SELECT REPLACE('Hello*', '*', '')

Однако , если у вас есть несколько звездочек в конце и несколько на всем протяжении, но интересует толькообрезая завершающие, тогда я бы использовал это:

DECLARE @String VarChar(50) = '**H*i****'
SELECT LEFT(@String, LEN(REPLACE(@String, '*', ' ')))              --Returns: **H*i

Я обновил этот ответ, чтобы включить показ, как удалить ведущие символы:

SELECT RIGHT(@String, LEN(REPLACE(REVERSE(@String), '*', ' ')))    --Returns: H*i****

LEN () имеет " функция"(это очень похоже на ошибку), где она не учитывает конечные пробелы.

4 голосов
/ 01 августа 2012

Если вы хотите удалить только один символ '*' из значения, когда значение заканчивается на '*', простое выражение CASE сделает это за вас:

SELECT CASE WHEN RIGHT(foo,1) = '*' THEN LEFT(foo,LEN(foo)-1) ELSE foo END AS foo
  FROM (SELECT 'BOB*' AS foo)

Чтобы удалить все завершающие символы '*', вам понадобится более сложное выражение, использующее функции REVERSE, PATINDEX, LEN и LEFT.

ПРИМЕЧАНИЕ: Будьте осторожны с функцией REPLACE, поскольку она заменит все вхождений указанного символа в строке, а не только концевых.

4 голосов
/ 20 октября 2011

Если вам нужно поведение, подобное тому, как RTRIM обрабатывает пробелы, то есть, что «B * O * B **» превратится в «B * O * B» без потери встроенных, тогда что-то вроде -

REVERSE(SUBSTRING(REVERSE('B*O*B**'), PATINDEX('%[^*]%',REVERSE('B*O*B**')), LEN('B*O*B**') - PATINDEX('%[^*]%', REVERSE('B*O*B**')) + 1))

Должен это сделать.

3 голосов
/ 20 октября 2011
LEFT('BOB*', LEN('BOB*')-1)

должен это сделать.

2 голосов
/ 19 ноября 2015

Как насчет .. (в данном случае обрезать завершающую запятую или точку)

Для переменной:

-- Trim commas and full stops from end of City
WHILE RIGHT(@CITY, 1) IN (',', '.'))    
    SET @CITY = LEFT(@CITY, LEN(@CITY)-1)  

Для табличных значений:

-- Trim commas and full stops from end of City
WHILE EXISTS (SELECT 1 FROM [sap_out_address] WHERE RIGHT([CITY], 1) IN (',', '.'))     
    UPDATE [sap_out_address]    
    SET [CITY] = LEFT([CITY], LEN([CITY])-1)  
    WHERE RIGHT([CITY], 1) IN (',', '.') 
2 голосов
/ 20 октября 2011

RRIM () LTRIM () удаляет только пробелы попробуйте http://msdn.microsoft.com/en-us/library/ms186862.aspx

В основном просто замените * пустым пробелом

REPLACE ('TextWithCharacterToReplace', 'CharacterToReplace', 'CharacterToReplaceWith')

Итак, вы хотите

ЗАМЕНИТЬ ('BOB *', '*', '')

1 голос
/ 27 марта 2015

Мне очень нравится ответ Тиджея , и он почти остановился на этом.Это умно, но у меня возникло «почти слишком умное» чувство, поскольку, так или иначе, ваша строка в какой-то момент будет фактически иметь ~ (или что-то еще) в ней специально.Так что это недостаточно защищает меня, чтобы запустить в производство.

Мне нравится Крис тоже , но вызов PATINDEX кажется излишним.

Хотя это, вероятно, микрооптимизация , вот этот без PATINDEX:

CREATE FUNCTION dbo.TRIMMIT(@stringToTrim NVARCHAR(MAX), @charToTrim NCHAR(1))
RETURNS NVARCHAR(MAX)
AS
BEGIN
    DECLARE @retVal NVARCHAR(MAX)

    SET @retVal = @stringToTrim

    WHILE 1 = charindex(@charToTrim, reverse(@retVal))
        SET @retVal = SUBSTRING(@retVal,0,LEN(@retVal))

    WHILE 1 = charindex(@charToTrim, @retVal)
        SET @retVal = SUBSTRING(@retVal,2,LEN(@retVal))

    RETURN @retVal
END

--select dbo.TRIMMIT('\\trim\asdfds\\\', '\')
--trim\asdfds

Возвращение MAX nvarchar немного меня раздражает, но этосамый гибкий способ сделать это ..

0 голосов
/ 29 декабря 2018

@ teejay решение отличное. Но приведенный ниже код может быть более понятным:

declare @X nvarchar(max)='BOB *'

set @X=replace(@X,' ','^')

set @X=replace(@X,'*',' ')

set @X= ltrim(rtrim(@X))

set @X=replace(@X,'^',' ')
...