假设我有一个字符串1,2,3,
我想删除最后一个,
,或者如果字符串看起来像,1,2,3,
或,1,2,3
我仍然想要1,2,3
{{1}} 1}}作为我的结果。
请尽量在答案中加以解释。我不只是想要复制粘贴的东西而不理解它。谢谢。
答案 0 :(得分:20)
处理“修剪”这样的逗号的一种方法是使用CASE
语句:
CASE
WHEN str LIKE ',%,' THEN SUBSTRING(str, 2, LEN(str)-2)
WHEN str LIKE ',%' THEN RIGHT(str, LEN(str)-1)
WHEN str LIKE '%,' THEN LEFT(str, LEN(str)-1)
ELSE str
END
这是非常不言自明的:CASE
语句考虑了三种情况 -
str
两边都有逗号时,str
以逗号开头,但不以一个结尾时,str
以逗号结尾,但不以一个逗号开头时。在第一种情况下,删除第一个和最后一个字符;在第二种情况下,最左边的字符被删除;在最后一种情况下,删除尾随字符。
答案 1 :(得分:1)
declare @str varchar(20)=',1,2,3,'
select case
when @str like ',%,' then stuff(stuff(@str, 1, 1, ''),LEN(stuff(@str, 1, 1, '')),1,'')
when @str like ',%' then stuff(@str, 1, 1, '')
when @str like '%,' then stuff(@str, LEN(@str), 1, '')
else @str
end
答案 2 :(得分:0)
dept_name
是列名,“我”是您要替换的字符。
SELECT REPLACE(Dept_Name,'I','')
FROM [Newone].[dbo].[Department]
where Dept_Name like 'I%' or Dept_Name like '%I'
答案 3 :(得分:0)
CASE
可以在这里工作。我在想这样的事情:
CASE
WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1 AND ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT MID(YourString, 2, LEN(YourString) - 2)
WHEN ISNUMERIC(RIGHT(YourString, 1)) <> 1
THEN SELECT LEFT(YourString, LEN(YourString) -1)
WHEN ISNUMERIC(LEFT(YourString, 1)) <> 1
THEN SELECT RIGHT(YourString, LEN(YourString) - 1)
ELSE SELECT YourString
END
无论字符是什么,它都会工作,因为它会检查第一个和最后一个是否为数字,如果没有得到你的新字符串,否则检查结果是否是数字,如果没有选择除了结尾之外的字符串,否则检查开头是否为数字,如果没有选择除开头之外的字符串,否则得到你的字符串。
答案 4 :(得分:0)
如果您需要在开头或结尾只更换一个逗号(就像在原始问题中那样),那么:
CASE
WHEN str LIKE '%,%' THEN
SUBSTRING(str, IIF(LEFT(str,1)=',',2,1),
LEN(str)-IIF(LEFT(str,1)=',',1,0)
-IIF(RIGHT(str,1)=',',1,0))
ELSE str
END
如果可以,,,,1,2,3,,,,
,则使用带有'%[0-9]%
掩码的PATINDEX()函数:
CASE
WHEN str LIKE '%,%' THEN
SUBSTRING(str, PATINDEX('%[0-9]%',str),
LEN(str)-(PATINDEX('%[0-9]%',str)-1)
-(PATINDEX('%[0-9]%',REVERSE(str))-1))
ELSE str
END
答案 5 :(得分:0)
一些选项,全部使用SQLCLR,如果这是您未被拒绝访问的内容。您可以编写自己的函数来执行这些操作,但我将展示的示例基于SQL# (SQLsharp)库。我是SQL#库的作者,但前两个示例使用的是Free版本中提供的函数。使用TrimChars()的第三个例子不是免费的,但我把它包括在内是为了完整性,因为它很简单;-)。在每个示例中,前或后额外逗号内的字符可以是任何内容。
一个简单的正则表达式,用于捕获组,以获取从第一个非逗号值到最后一个非逗号值的所有内容:
SELECT SQL#.RegEx_CaptureGroup(N',,12,123,12334,567,,,,,',
N'^,*(.+?),*$', -- Regular Expression
1, -- Capture Group to return
'', -- not found replacement
1, -- Start At position
-1, -- Length
'' -- RegEx Options
)
如果删除额外逗号的原因是为了获得一个干净的分割列表,你可以拆分它们并让split函数为你删除空值,因此不需要担心空值的位置,即使在中间:
SELECT *FROM SQL#.String_Split(N',,12,123,12334,567,,,,,', N',', 2)
-- 2 = remove empty values
您可以执行一个简单的修剪,从两侧删除指定的字符,直到找到不是修剪字符的字符:
SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',')
答案 6 :(得分:0)
如果你只想删除一个尾随逗号,在SQL Server中,我使用STUFF函数,它看起来像这样:
SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring
from yourtable
答案 7 :(得分:0)
试试这个。 REVERSE(SUBSTRING(REVERSE(FLD),2,LEN(FLD))) 无论如何,它总是会占用最后一个角色。 您可以通过简单地说CASE WHEN REVERSE(SUBSTRING(fld,1,1))=','那么反转(SUBSTRING(REVERSE(fld),2,LEN(fld))来设置CASE WHEN语句以确保最后一个字符是逗号))ELSE fld END fld