SQL Server修剪字符
我有以下字符串:“BOB*”,如何修剪*使其显示为“BOB” 我尝试了RTRIM('BOB*','*'),但没有按所说的那样工作,只需要1个参数。RRIM()LTRIM()仅删除空格重试 基本上只是用空的空间替换*而已 替换('TextWithCharacterToReplace'、'CharacterToReplace'、'CharacterToReplace with') 所以你想要 替换('BOB*'、'*'、'') 应该这样做。试试这个: 原创SQL Server修剪字符,sql,character,trim,Sql,Character,Trim,我有以下字符串:“BOB*”,如何修剪*使其显示为“BOB” 我尝试了RTRIM('BOB*','*'),但没有按所说的那样工作,只需要1个参数。RRIM()LTRIM()仅删除空格重试 基本上只是用空的空间替换*而已 替换('TextWithCharacterToReplace'、'CharacterToReplace'、'CharacterToReplace with') 所以你想要 替换('BOB*'、'*'、'') 应该这样做。试试这个: 原创 select replace('BOB*'
select replace('BOB*','*','')
固定为精确的替代品
select replace('BOB*','BOB*','BOB')
如果您想要类似于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))
应该这样做。如果当值以
'*'
结尾时,您只想从值中删除单个'*'
字符,则一个简单的大小写表达式将为您做到这一点:
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函数,因为它将替换字符串中所有出现的指定字符,而不仅仅是尾随字符。在MS SQL Server中实现Oracle的
从字符串修剪字符的另一个非常好的方法是:
- 首先,您需要识别一个永远不会在字符串中使用的字符,例如
~
- 用该字符替换所有空格
- 将要修剪的字符
*
替换为空格
- 您可以
LTrim
+RTrim
获取的字符串
- 将所有空格替换回经过修剪的字符
*
- 将所有从未使用过的字符替换回空格
例如:
REPLACE(REPLACE(LTrim(RTrim(REPLACE(REPLACE(string,' ','~'),'*',' '))),' ','*'),'~',' ')
如果要删除所有星号,那么很明显:
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()有一个“功能”(看起来很像一个bug),它不计算尾随空格。我真的很喜欢,几乎就停在那里了。它很聪明,但我有一种“几乎太聪明”的感觉,因为不知何故,您的字符串在某个点上实际上会故意在其中包含一个~
(或任何东西)。所以这还不足以让我投入生产
我喜欢,但是PATINDEX
调用似乎有些过分了
虽然它可能是一个,但这里有一个没有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会让我有点不舒服,但这是最灵活的方法..怎么样。。(在本例中,删除尾随的逗号或句点)
对于变量:
-- 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 (',', '.')
用许多箱子装饰
--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
是右裆(]
),则当前存在一个问题,因为似乎没有办法避免此问题
一个字符参数的解决方案:
rtrim('0000100','0')->
选择左侧('0000100',len(rtrim(替换('0000100','0',''))
ltrim('0000100','0')->
选择右('0000100',len(替换(ltrim(替换('0000100','0',''),''))SqlServer2017有了一种新的方法:
选择修剪(“00001900”中的“0”);->十九,
从“测试”中选择修剪(“,!”);->试验
从“BOB*”中选择修剪(“*”);-->鲍勃
不幸的是,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('=SPECIALS='中的'=SPECIALS=')作为结果代码>
Result
--------
SPECIALS
不幸的是,LTRIM
和RTRIM
的工作方式不同,它们只会删除空格,而不是指定字符,就像TRIM在指定其名称时所做的那样
参考和更多示例:
这将替换文本中的所有星号*这将从字符串中删除最后一个字符,无论该字符是否为星号。这适用于以星号结尾的字符串的特殊情况,但不会检查是否应删除最后一个字符。它也不会修剪多个星号。原始问题没有说“如果有星号,我只想删除一个星号”或“我想删除所有星号,无论有多少个星号”。我回答了问题。它将从值中删除最后一个字符,无论该字符是特殊字符、字母或数字,它根本不是通用解决方案。如果只对'BOB'
执行此操作,则结果将是'BO'
,根据问题,这是无效的。左侧('BOB*',3)
不幸的是,此方法无法修剪]
和^
(请参阅我的问题)。我写了两个小函数,在MsSql服务器上实现了LTRIM
和RTRIM
,请参见我在上面链接的同一页中的自我回答。这是可行的,但只会正确修剪值。。。两边修剪的最佳方式是什么?这很好。我改编了一个版本
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))
)
declare @X nvarchar(max)='BOB *'
set @X=replace(@X,' ','^')
set @X=replace(@X,'*',' ')
set @X= ltrim(rtrim(@X))
set @X=replace(@X,'^',' ')
Result
--------
SPECIALS
SELECT REPLACE('BOB*', '*', '')
SELECT REPLACE('B*OB*', '*', '')
-------------------------------------
Result : BOB
-------------------------------------