SQL Server TRIM字符

时间:2011-10-20 15:52:59

标签: sql character trim

我有以下字符串:'BOB *',我如何修剪*所以它显示为'BOB'

我尝试了RTRIM('BOB *','*'),但不起作用,因为只需要1个参数。

18 个答案:

答案 0 :(得分:21)

MS SQL Server 中实施Oracle TRIM char FROM string的另一个好方法如下:

  • 首先,您需要识别一个永远不会在您的字符串中使用的字符,例如~
  • 您用该字符替换所有空格
  • 您可以用空格
  • 替换要修剪的角色*
  • LTrim + RTrim获取的字符串
  • 使用修剪后的字符*
  • 替换所有空格
  • 您将所有未使用的字符替换为空格

例如:

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

答案 1 :(得分:16)

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'

答案 2 :(得分:10)

如果你想删除所有星号,那么它很明显:

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

然而,如果你最后有多个星号和多个星号,但只对修剪尾随的星号感兴趣,那么我将使用它:

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

我更新了这个答案,包括show show如何删除主角:

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

LEN()有一个" 功能" (看起来很像一个bug),它不计算尾随空格。

答案 3 :(得分:4)

如果你想要的行为类似于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))

应该这样做。

答案 4 :(得分:4)

如果您只想在值以'*'结尾时从值中删除单个'*'字符,则一个简单的CASE表达式将为您执行此操作:

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

要删除所有尾随的'*'字符,您需要使用更复杂的表达式,并使用REVERSEPATINDEXLEN和{{1}函数。

注意:注意REPLACE函数,因为它将替换字符串中指定字符的所有次出现,而不仅仅是尾随的

答案 5 :(得分:2)

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

应该这样做。

答案 6 :(得分:2)

如何...(在这种情况下修剪尾随的逗号或句号)

对于变量:

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

答案 7 :(得分:2)

RRIM()LTRIM()仅删除空格try http://msdn.microsoft.com/en-us/library/ms186862.aspx

基本上只需用空格替换*

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

所以你想要

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

答案 8 :(得分:1)

    SELECT REPLACE('BOB*', '*', '')  
    SELECT REPLACE('B*OB*', '*', '') 
-------------------------------------
     Result : BOB
-------------------------------------

这将替换文本中的所有星号*

答案 9 :(得分:0)

试试这个:

<强>原始

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

已修复确切替换

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

答案 10 :(得分:0)

我非常喜欢Teejay's answer,几乎就此停在那里。这很聪明,但我得到了“几乎太聪明”的感觉,因为不知何故,你的字符串在某个时刻实际上会有~(或其他)故意。所以这对我来说并不足以让我投入生产。

我喜欢Chris' too,但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让我有点烦恼,但这是最灵活的方法..

答案 11 :(得分:0)

修剪很多案例

--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 :(得分:0)

我使用了类似的方法来解决使用模式匹配和反转字符串的上述一些答案,找到第一个不可修剪的字符,然后将其剪掉。区别在于这个版本的工作量比上面那些少,所以应该更有效率。

  • 这为任何指定的角色创建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))
)

答案 13 :(得分:0)

一个char参数的解决方案:

rtrim(&#39; 0000100&#39;,&#39; 0&#39;) - &gt; 选择左(&#39; 0000100&#39;,len(rtrim(替换(&#39; 0000100&#39;,&#39; 0&#39;,&#39;&#39;))))

ltrim(&#39; 0000100&#39;,&#39; 0&#39;) - &gt; 选择正确(&#39; 0000100&#39;,len(替换(替换(&#39; 0000100&#39;,&#39; 0&#39;,&#39;&#39;)),& #39;&#39;,&#39;。&#39;)))

答案 14 :(得分:0)

SqlServer2017具有一种新的实现方法:https://docs.microsoft.com/en-us/sql/t-sql/functions/trim-transact-sql?view=sql-server-2017

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

SELECT TRIM('。,!'FROM'#test。'); ->#测试

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

不幸的是,RTRIM不支持修剪特定字符。

答案 15 :(得分:0)

@teejay解决方案很棒。但是下面的代码可以更容易理解:

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

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

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

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

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

答案 16 :(得分:0)

仅当您要删除开头和结尾字符时,另一种方法是使用TRIM函数。 默认情况下,删除空格,但如果指定空格,则可以删除其他字符。

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

Result  
--------
SPECIALS

不幸的是,LTRIMRTRIM的工作方式不同,只能删除空格而不是指定字符(如您指定了TRIM一样)。

  

参考和更多示例:   https://database.guide/how-to-remove-leading-and-trailing-characters-in-sql-server/

答案 17 :(得分:0)

这是我过去使用的一个函数。请注意,虽然您可以通过使用额外的参数(例如您想要删除的字符以及您将用什么来替换空格字符)来使其更通用,但这会大大增加执行时间。在这里,我使用管道在预修整输入后替换空格。如果需要,将 varchar 更改为 nvarchar。

CREATE FUNCTION [dbo].[TrimColons] 
    (
        @strToTrim varchar(500)
    )
    RETURNS varchar(500)
    AS
    BEGIN
        RETURN REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(REPLACE(LTRIM(RTRIM(@strToTrim)),' ','|'),':',' '))),' ',':'),'|',' ')
    
        /*
        Here's a breakdown of this fancy, schmancy, trimmer
    
        LTRIM(RTRIM(@strToTrim))  trims leading & trailing spaces first
        REPLACE(LTRIM(RTRIM(@strToTrim)),' ','|')  replaces inside spaces with pipe char
        REPLACE(REPLACE(LTRIM(RTRIM(@strToTrim)),' ','|'),':',' ') replaces demarc character, the colon, with spaces
        LTRIM(RTRIM(REPLACE(REPLACE(LTRIM(RTRIM(@strToTrim)),' ','|'),':',' ')))  trims the leading & trailing  converted-to-space demarc char (colon) 
        REPLACE(LTRIM(RTRIM(REPLACE(REPLACE(LTRIM(RTRIM(@strToTrim)),' ','|'),':',' '))),' ',':') replaces the inner space characters back to demar char (colon)
        REPLACE(REPLACE(LTRIM(RTRIM(REPLACE(REPLACE(LTRIM(RTRIM(@strToTrim)),' ','|'),':',' '))),' ',':'),'|',' ') replaces the pipe characters back to original space characters
    
        */
    END