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

问题描述 投票:0回答:9

假设我有一个字符串

1,2,3,
我想删除最后一个
,
或者如果字符串看起来像
,1,2,3,
,1,2,3
我仍然想得到
1,2,3
作为我的结果。 请尝试在您的回答中进行一些解释。我不想只是在不理解的情况下复制粘贴内容。谢谢。

sql sql-server sql-server-2008
9个回答
27
投票

处理“修剪”逗号的一种方法是使用

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

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

sqlfiddle 上的演示。


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

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

无论字符是什么,这都有效,因为它首先检查第一个和最后一个是否是数字,如果没有获取新字符串,则检查末尾是否是数字,如果不选择除末尾之外的字符串,否则检查查看开头是否为数字,如果不选择开头以外的字符串,则获取您的字符串。


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,,,,
是可能的,则使用 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

SQLFiddle 演示


0
投票

一些选项,全部使用 SQLCLR,如果您没有被拒绝访问的话。您可以编写自己的函数来执行这些操作,但我将展示的示例基于 SQL# (SQLsharp) 库。我是 SQL# 库的作者,但前 2 个示例使用免费版本中提供的函数。 第三个示例使用 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. 您可以执行一个简单的 Trim,从两侧删除指定的字符,直到找到不是要 Trim 的字符:

    SELECT SQL#.String_TrimChars(N',,12,123,12334,567,,,,,', N',')
    

0
投票

如果你只想删除结尾的逗号,在 SQL Server 中,我会使用 STUFF 函数,它看起来像这样:

SELECT STRING, stuff(string, (len(string) - 1),1,'') as newstring
from yourtable

0
投票

dept_name
是列名称,“I”是您要替换的字符。

SELECT REPLACE(Dept_Name,'I','')
FROM [Newone].[dbo].[Department]
where Dept_Name like 'I%' or Dept_Name like  '%I'

0
投票

试试这个。

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

0
投票

LTRIM 和 RTRIM 允许使用可选参数来执行此操作。

LTRIM ( character_expression , [ characters ] )

当我在 MSSMS 中输入以下语句时,它们被识别为不正确,并显示工具提示消息“RTRIM 函数需要一个参数”。然而,当执行时,它们确实有效。

修剪前导逗号:

SELECT LTRIM(',hello,', ',')

修剪尾随逗号:

SELECT RTRIM(',hello,', ',')

修剪前导和尾随逗号:

SELECT RTRIM(LTRIM(',hello,',','), ',') 
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.