2012-05-03 3 views
2

У меня есть эта строка для nvarcharнапример:Как LTRIM/RTRIM конкретные символы?

declare @s as nvarchar(max) 
set @s = ' ##a# bc## ###' 

Так что мне нужно пространство, чтобы быть trimed, но и # символов.
Как я могу вернуть только 'a# bc'?

(количество ведущего и хвостовые # могут различаться)

+1

Ожидаете ли вы, что # появится где-нибудь еще? или просто ведущий/конечный? Всегда 3 ###? – gbn

+0

@ gbn, да. Я уточню свой вопрос. спасибо, что заметили. – ZigiZ

ответ

4

Вы можете использовать следующие общие функции, чтобы вырезать произвольными начальные и конечные символы, просто вызвав

dbo.LTrimX(dbo.RTrimX(' ##a# bc### ', ' #'), ' #') 

Здесь UDF, (адаптировано из here):

CREATE FUNCTION dbo.LTrimX(@str VARCHAR(MAX), @trimchars VARCHAR(255)) RETURNS VARCHAR(MAX) 
    AS 
    BEGIN 
    IF @str LIKE '[' + @trimchars + ']%' 
    SET @str =STUFF (@str , 1 , PATINDEX('%[^' + @trimchars + ']%', @str)-1 , '') 
    RETURN @str 
END 

CREATE FUNCTION dbo.RTrimX(@str VARCHAR(MAX), @trimchars VARCHAR(255)) RETURNS VARCHAR(MAX) 
    AS 
    BEGIN 
    IF @str LIKE '%[' + @trimchars + ']' 
    SET @str = REVERSE(dbo.LTrimX(REVERSE(@str), @trimchars)) 
    RETURN @str 
END 
GO 
+1

Могу ли я безопасно изменить 'VARCHAR' на' NVARCHAR' в ваших функциях? – ZigiZ

+0

Поскольку все задействованные функции поддерживают 'NVARCHAR', я бы сказал, да, но я не тестировал его. – MicSim

+0

10x. Это отлично работает. – ZigiZ

4

Предполагая, что а часть только когда-либо из цифр и букв:

DECLARE @s NVARCHAR(50) 
SET @s = ' ##a# bc### ' 

SELECT 
SUBSTRING(@s,PATINDEX('%[A-Za-z0-9]%',@s),LEN(@s) - PATINDEX('%[A-Za-z0-9]%',REVERSE(@s)) -1) as string2 
Смежные вопросы