У меня есть следующая строка: "BOB *", как мне обрезать *, чтобы она отображалась как "BOB"
Я попробовал RTRIM ('BOB *', '*'), но не работает, поскольку говорит, что требуется только 1 параметр.
У меня есть следующая строка: "BOB *", как мне обрезать *, чтобы она отображалась как "BOB"
Я попробовал RTRIM ('BOB *', '*'), но не работает, поскольку говорит, что требуется только 1 параметр.
LEFT('BOB*', LEN('BOB*')-1)
должен это сделать.
Еще один довольно хороший способ реализовать Oracle TRIM char FROM string
в MS SQL Server:
~
*
, который хотите обрезать с помощью пробелаLTrim
+ RTrim
полученная строка*
Например:
REPLACE(REPLACE(LTrim(RTrim(REPLACE(REPLACE(string,' ','~'),'*',' '))),' ','*'),'~',' ')
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'
Если вы хотите удалить все звездочки, тогда это очевидно:
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() имеет "функцию" (которая очень похожа на ошибку), где она не учитывает конечные пробелы.
Если вы хотите, чтобы поведение было похоже на то, как 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))
Должно это сделать.
Если вы хотите удалить только один символ '*'
из значения, когда значение заканчивается на '*'
, простое выражение 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, так как это заменит все вхождения указанного символа в строке, а не только конечные.
RRIM() LTRIM() удаляет только пробелы. http://msdn.microsoft.com/en-us/library/ms186862.aspx
В принципе просто замените * на пустое пространство
REPLACE ( 'TextWithCharacterToReplace', 'CharacterToReplace', 'CharacterToReplaceWith')
Итак, вы хотите
REPLACE ('BOB *', '*', '')
Как насчет.. (в этом случае обрезать конечную запятую или период)
Для переменной:
-- 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 (',', '.')
Мне очень нравится ответ 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 меня немного задевает, но это самый гибкий способ сделать это.
Попробуйте следующее:
Оригинал
select replace('BOB*','*','')
Исправлено для точной замены
select replace('BOB*','BOB*','BOB')
Обрезать со многими случаями
--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
Я использовал аналогичный подход к некоторым из приведенных выше ответов об использовании сопоставления шаблонов и об изменении строки, чтобы найти первый нетримлируемый символ, а затем отключить его. Разница заключается в том, что эта версия работает не так, как указано выше, поэтому она должна быть немного более эффективной.
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))
)
Решение для одного параметра char:
rtrim ('0000100', '0') → select left ('0000100', len (rtrim (replace ('0000100', '0', ''))))
ltrim ('0000100', '0') → select right ('0000100', len (заменить (ltrim (заменить ('0000100', '0', '')), '', '.')))
SqlServer2017 имеет новый способ сделать это: https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql?view=sql-server-2017
ВЫБЕРИТЕ TRIM ('0' ОТ '00001900'); → 19
SELECT TRIM ('.,!' FROM '# test.'); → # test
ВЫБЕРИТЕ TRIM ('*' ОТ 'БОБ *'); → ЛПП
К сожалению, RTRIM не поддерживает обрезку определенного символа.
Решение @teejay отличное. Но приведенный ниже код может быть более понятным:
declare @X nvarchar(max)='BOB *'
set @X=replace(@X,' ','^')
set @X=replace(@X,'*',' ')
set @X= ltrim(rtrim(@X))
set @X=replace(@X,'^',' ')
Другой подход, ТОЛЬКО если вы хотите удалить начальные и конечные символы, - это использование функции 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/