T-Sql删除所有点,但保留最后一个

时间:2019-11-27 14:50:14

标签: sql-server tsql

我在Sql中有一个像下面这样的变量

DECLARE @MyVariable AS VARCHAR(50) = 'My Name. Is Ibrahim. AND. I am. Searching For. A. Solution. aa'

当我打印@MyVariable

print(@MyVariable)

输出如下所示

  

我的名字。是易卜拉欣。和。我是。正在搜寻。一个办法。 aa

这很好,但是现在我想删除除最后一个点之外的所有点

我的预期输出如下所示

输出如下所示

  

我的名字叫易卜拉欣,我正在寻找解决方案。 aa

我怎么能做到这一点,我用google却找不到任何东西

4 个答案:

答案 0 :(得分:1)

还有另一个(简单的恕我直言)选项:

DECLARE @MyVariable AS VARCHAR(100) = 'My Name. Is Ibrahim. AND. I am. Searching For. A. Solution. aa';

SELECT  REPLACE(
            LEFT(@MyVariable, LEN(@MyVariable) - CHARINDEX('.', REVERSE(@MyVariable)))
        , '.', '') + 
        RIGHT(@MyVariable, CHARINDEX('.', REVERSE(@MyVariable)))

您将替换字符串中最后一个点之前的所有点,并将其连接到字符串中从最后一个点到末尾的那一部分。

刹车:

  • CHARINDEX('.', REVERSE(@MyVariable))为您提供最后一个点的索引。
  • LEFT(@MyVariable, LEN(@MyVariable) - CHARINDEX('.', REVERSE(@MyVariable)))为您提供字符串的最后一个点(包括最后一个点)的部分。
  • REPLACE(LEFT(@MyVariable, LEN(@MyVariable) - CHARINDEX('.', REVERSE(@MyVariable))), '.', '')为您提供了字符串中没有点的那一部分。
  • RIGHT(@MyVariable, CHARINDEX('.', REVERSE(@MyVariable)))为您提供字符串的最后一部分,包括最后一个点。

如果您的字符串不包含任何点,它将仅返回相同的字符串。

答案 1 :(得分:0)

如果.字符始终位于结尾,则很简单:

SELECT REPLACE(@MyVariable,'.','') + '.';

只需删除 all .字符,然后在末尾添加一个。

编辑:使用正确的注释,您需要执行以下操作:

DECLARE @MyVariable AS VARCHAR(50) = 'My Name. Is Ibrahim. AND. I am. Searching For. A. Solution. aa';

SELECT REPLACE(LEFT(V.MyString, LEN(MyString) - (CI.I - 1)),'.','') + RIGHT(V.MyString,CI.I)
FROM (VALUES(@MyVariable),('This.is.a.string'))V(MyString)
     CROSS APPLY (VALUES(NULLIF(CHARINDEX('.',REVERSE(V.MyString)),1)))CI(I);

请注意,对于您的示例字符串,返回值为'My Name Is Ibrahim AND I am Searching For A. ';因为初始字符串超过50个字符,因此被截断了。

答案 2 :(得分:0)

这是一个仅使用字符串操作的选项。

DECLARE
  @MyVariable VARCHAR(100) = 'My Name. Is Ibrahim. AND. I am. Searching For. A. Solution. aa'
 ,@FixFor     CHAR(1)      = '.'         
 ,@LastHit    INT

首先,找到目标字符最后一次出现的位置:

SET @LastHit = len(@MyVariable) - charindex(@FixFor, reverse(@MyVariable)) + 1

使用该值,我们可以进行一些尴尬的字符串操作:

PRINT replace(left(@MyVariable, @LastHit - 1), @FixFor, '') + substring(@MyVariable, @LastHit, 100)

这可以变成一条语句,但是如果您这样做,以后必须使用您的代码的任何人都会讨厌您:

PRINT replace(left(@MyVariable, len(@MyVariable) - charindex(@FixFor, reverse(@MyVariable))), @FixFor, '') + substring(@MyVariable, len(@MyVariable) - charindex(@FixFor, reverse(@MyVariable)) + 1, 100)

您将注意到T-SQL并不是用于字符串操作的好语言。尽可能将格式留给前端应用程序,这会做得很好。

答案 3 :(得分:0)

只需三步,您就可以实现所需的结果。 第一个变量找到最后一个点的位置, 第二个变量删除除最后一个变量以外的点, 第三个变量在最后一个点之后找到字符串, 并串联了两个变量以获得所需的输出。

DECLARE @MyVariable AS VARCHAR(100) = 'My Name. Is Ibrahim. AND. I am. Searching For. A. Solution. aa'
DECLARE @FirstDot as int =LEN(@MyVariable)-PATINDEX('%.%',REVERSE(@MyVariable))
DECLARE @RemoveDotsBeforeLastDot as varchar(100) =  REPLACE(SUBSTRING(@MyVariable,1,@FirstDot),'.',' ')
DECLARE @AfterLastDot as varchar(100) = SUBSTRING(@MyVariable,@FirstDot+1,LEN(@MyVariable))

select CONCAT(@RemoveDotsBeforeLastDot,@AfterLastDot)