如何从字符串中删除特定字符,仅当它是字符串中的第一个或最后一个字符时。

时间:2013-12-20 05:01:26

标签: sql sql-server sql-server-2008

假设我有一个字符串1,2,3,我想删除最后一个,,或者如果字符串看起来像,1,2,3,,1,2,3我仍然想要1,2,3 {{1}} 1}}作为我的结果。 请尽量在答案中加以解释。我不只是想要复制粘贴的东西而不理解它。谢谢。

8 个答案:

答案 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以逗号结尾,但不以一个逗号开头时。

在第一种情况下,删除第一个和最后一个字符;在第二种情况下,最左边的字符被删除;在最后一种情况下,删除尾随字符。

Demo on sqlfiddle.

答案 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

SQLFiddle demo

答案 5 :(得分:0)

一些选项,全部使用SQLCLR,如果这是您未被拒绝访问的内容。您可以编写自己的函数来执行这些操作,但我将展示的示例基于SQL# (SQLsharp)库。我是SQL#库的作者,但前两个示例使用的是Free版本中提供的函数。使用TrimChars()的第三个例子不是免费的,但我把它包括在内是为了完整性,因为它很简单;-)。在每个示例中,前或后额外逗号内的字符可以是任何内容。

  1. 一个简单的正则表达式,用于捕获组,以获取从第一个非逗号值到最后一个非逗号值的所有内容:

    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
                                   )
    
  2. 如果删除额外逗号的原因是为了获得一个干净的分割列表,你可以拆分它们并让split函数为你删除空值,因此不需要担心空值的位置,即使在中间:

    SELECT *FROM SQL#.String_Split(N',,12,123,12334,567,,,,,', N',', 2)
    -- 2 = remove empty values
    
  3. 您可以执行一个简单的修剪,从两侧删除指定的字符,直到找到不是修剪字符的字符:

    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