Подтвердить что ты не робот

Символ TRIM SQL Server

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

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

4b9b3361

Ответ 1

LEFT('BOB*', LEN('BOB*')-1)

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

Ответ 2

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

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

Например:

REPLACE(REPLACE(LTrim(RTrim(REPLACE(REPLACE(string,' ','~'),'*',' '))),' ','*'),'~',' ')

Ответ 3

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('%[^'[email protected]+']%', @Value), LEN(@Value)))
    SET @Value = REVERSE(SUBSTRING(@Value, PATINDEX('%[^'[email protected]+']%', @Value), LEN(@Value)))
    RETURN @Value
END
GO
--- Example
----- SELECT dbo.TrimCharacter('***BOB*********', '*')
----- returns 'BOB'

Ответ 4

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

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() имеет "функцию" (которая очень похожа на ошибку), где она не учитывает конечные пробелы.

Ответ 5

Если вы хотите, чтобы поведение было похоже на то, как 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))

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

Ответ 6

Если вы хотите удалить только один символ '*' из значения, когда значение заканчивается на '*', простое выражение 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, так как это заменит все вхождения указанного символа в строке, а не только конечные.

Ответ 7

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

В принципе просто замените * на пустое пространство

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

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

REPLACE ('BOB *', '*', '')

Ответ 8

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

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

-- 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 (',', '.') 

Ответ 9

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

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

Хотя это возможно micro-optimization, здесь без 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 меня немного задевает, но это самый гибкий способ сделать это.

Ответ 10

Попробуйте следующее:

Оригинал

select replace('BOB*','*','')

Исправлено для точной замены

select replace('BOB*','BOB*','BOB')

Ответ 11

Обрезать со многими случаями

--id = 100 101 102 103 104 105 106 107 108 109 110 111
select right(id,2)+1  from ordertbl -- 1 2 3 4 5 6 7 8 9 10 11  -- last     two positions are taken

select LEFT('BOB', LEN('BOB')-1) -- BO

select LEFT('BOB*',1) --B
select LEFT('BOB*',2) --BO

Ответ 12

Я использовал аналогичный подход к некоторым из приведенных выше ответов об использовании сопоставления шаблонов и об изменении строки, чтобы найти первый нетримлируемый символ, а затем отключить его. Разница заключается в том, что эта версия работает не так, как указано выше, поэтому она должна быть немного более эффективной.

  • Это создает функциональность RTRIM для любого заданного символа.
  • Он включает в себя дополнительный шаг set @charToFind = case... для выхода из выбранного символа.
  • В настоящее время существует проблема, если @charToReplace является правильным crotchet (]), поскольку, похоже, нет способа избежать этого.

.

declare @stringToSearch nvarchar(max) = '****this is****a  ** demo*****'
, @charToFind nvarchar(5) = '*' 

--escape @charToFind so it doesn't break our pattern matching
set @charToFind = case @charToFind 
    when ']' then '[]]' --*this does not work / can't find any info on escaping right crotchet*
    when '^' then '\^'
    --when '%' then '%' --doesn't require escaping in this context
    --when '[' then '[' --doesn't require escaping in this context
    --when '_' then '_' --doesn't require escaping in this context
    else @charToFind
end

select @stringToSearch
, left
(
    @stringToSearch
    ,1 
    + len(@stringToSearch)
    - patindex('%[^' + @charToFind  + ']%',reverse(@stringToSearch))
)

Ответ 13

Решение для одного параметра char:

rtrim ('0000100', '0') → select left ('0000100', len (rtrim (replace ('0000100', '0', ''))))

ltrim ('0000100', '0') → select right ('0000100', len (заменить (ltrim (заменить ('0000100', '0', '')), '', '.')))

Ответ 15

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

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

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

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

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

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

Ответ 16

Другой подход, ТОЛЬКО если вы хотите удалить начальные и конечные символы, - это использование функции TRIM. По умолчанию удаляет пробелы, но может удалить другие символы, если вы укажете его.

SELECT TRIM('=' FROM '=SPECIALS=') AS Result;

Result  
--------
SPECIALS

К сожалению, LTRIM и RTRIM не работают одинаково и удаляют только пробелы вместо указанных символов, как это делает TRIM, если вы укажете их.

Reference и more examples: https://database.guide/how-to-remove-leading-and-trailing-characters-in-sql-server/