假设我有一个字符串
1,2,3,
我想删除最后一个 ,
或者如果字符串看起来像 ,1,2,3,
或 ,1,2,3
我仍然想得到 1,2,3
作为我的结果。
请尝试在您的回答中进行一些解释。我不想只是在不理解的情况下复制粘贴内容。谢谢。
处理“修剪”逗号的一种方法是使用
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
以逗号开头,但不以 1 结尾时,并且str
以逗号结尾,但不以逗号开头时。第一种情况,第一个和最后一个字符被删除;在第二种情况下,最左边的字符被删除;在最后一种情况下,尾随字符被删除。
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
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
无论字符是什么,这都有效,因为它首先检查第一个和最后一个是否是数字,如果没有获取新字符串,则检查末尾是否是数字,如果不选择除末尾之外的字符串,否则检查查看开头是否为数字,如果不选择开头以外的字符串,则获取您的字符串。
如果您只需要在开头或结尾替换一个逗号(如您原来的问题中所示),则:
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,,,,
是可能的,则使用 PATINDEX() 函数和 '%[0-9]%
掩码:
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
一些选项,全部使用 SQLCLR,如果您没有被拒绝访问的话。您可以编写自己的函数来执行这些操作,但我将展示的示例基于 SQL# (SQLsharp) 库。我是 SQL# 库的作者,但前 2 个示例使用免费版本中提供的函数。 第三个示例使用 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
您可以执行一个简单的 Trim,从两侧删除指定的字符,直到找到不是要 Trim 的字符:
SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',')
如果你只想删除结尾的逗号,在 SQL Server 中,我会使用 STUFF 函数,它看起来像这样:
SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring
from yourtable
dept_name
是列名称,“I”是您要替换的字符。
SELECT REPLACE(Dept_Name,'I','')
FROM [Newone].[dbo].[Department]
where Dept_Name like 'I%' or Dept_Name like '%I'
试试这个。
REVERSE(SUBSTRING(REVERSE(fld),2,LEN(fld)))
无论如何,它总是会采用最后一个字符。 您可以添加 CASE WHEN 语句来确保最后一个字符是逗号,只需说
CASE
WHEN REVERSE(SUBSTRING(fld,1,1))=',' THEN REVERSE(SUBSTRING(REVERSE(fld),2,LEN(fld)))
ELSE fld
END fld
LTRIM 和 RTRIM 允许使用可选参数来执行此操作。
LTRIM ( character_expression , [ characters ] )
当我在 MSSMS 中输入以下语句时,它们被识别为不正确,并显示工具提示消息“RTRIM 函数需要一个参数”。然而,当执行时,它们确实有效。
修剪前导逗号:
SELECT LTRIM(',hello,', ',')
修剪尾随逗号:
SELECT RTRIM(',hello,', ',')
修剪前导和尾随逗号:
SELECT RTRIM(LTRIM(',hello,',','), ',')