我有以下字符串:'BOB *',我如何修剪*所以它显示为'BOB'
我尝试了RTRIM('BOB *','*'),但不起作用,因为只需要1个参数。
答案 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)
要删除所有尾随的'*'
字符,您需要使用更复杂的表达式,并使用REVERSE
,PATINDEX
,LEN
和{{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
不幸的是,LTRIM
和RTRIM
的工作方式不同,只能删除空格而不是指定字符(如您指定了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