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

Символ SQL Server TRIM

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

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

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

Ответы [ 15 ]

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

SqlServer2017 имеет новый способ сделать это: https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql?view=sql-server-2017

SELECT TRIM ('0' FROM '00001900');-> 19

SELECT TRIM ('.,!' FROM '# test.');-> # test

SELECT TRIM ('*' FROM 'BOB *');-> BOB

К сожалению, RTRIM не поддерживает обрезку определенного символа.

0 голосов
/ 06 июля 2016

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

rtrim ('0000100', '0') -> выберите влево ('0000100', len (rtrim (заменить ('0000100', '0', ''))))

ltrim ('0000100', '0') -> выберите право ('0000100', len (заменить (ltrim (заменить ('0000100', '0', '')), '', '.')))

0 голосов
/ 03 марта 2016

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

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

.

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))
)
0 голосов
/ 23 января 2016

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

--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
0 голосов
/ 20 октября 2011

Попробуйте это:

Оригинал

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

Исправлена ​​точная замена

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