SQL String - 删除2次出现之间的子字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL String - 删除2次出现之间的子字符串相关的知识,希望对你有一定的参考价值。

我有一些字符串:

0@11001@2017@308     
0@1@2018@327          
0@200510@2020@3022

我需要删除年份值(在最后2'@'之间)。所以结果应该是这样的:

0@11001@308     
0@1@327          
0@200510@3022

有一个简单的查询吗?

答案

这里最好的做法是规范化您的数据,并停止在单个列中存储嵌入在单个字符串中的多个数据点。话虽这么说,如果你必须继续,我们可以尝试使用基本字符串函数将更新拼接在一起:

UPDATE yourTable
SET col = LEFT(col, CHARINDEX('@', col, CHARINDEX('@', col) + 1)) +
    REVERSE(LEFT(REVERSE(col), CHARINDEX('@', REVERSE(col)) - 1));

enter image description here

Demo

请注意,这个答案假定每个记录中都有三个@分隔符。如果没有,那么我们将不得不添加额外的逻辑。

另一答案
UPDATE
  yourTable
SET
  col = STUFF(yourTable.col, AtSign2.pos, atSign3.pos - atSign2.pos, '')
FROM
  yourTable
OUTER APPLY
  (SELECT CHARINDEX('@', yourTable.col,             0)) AS atSign1(pos)
OUTER APPLY
  (SELECT CHARINDEX('@', yourTable.col, atSign1.pos+1)) AS atSign2(pos)
OUTER APPLY
  (SELECT CHARINDEX('@', yourTable.col, atSign2.pos+1)) AS atSign3(pos)
另一答案
DECLARE @STRING VARCHAR(50) = '0@200510@2020@3022'

DECLARE @NEED_TO_REMOVE VARCHAR(50) = PARSENAME(REPLACE(@STRING,'@','.'),2) + '@'

SELECT REPLACE(@STRING,@NEED_TO_REMOVE,'') --result: 0@200510@3022

以上是关于SQL String - 删除2次出现之间的子字符串的主要内容,如果未能解决你的问题,请参考以下文章

替换字符串中第 n 次出现的子字符串

在Java中的字符串中查找第二次出现的子字符串

PLSQL 在第 N 次和第 M 次出现字符之间选择 substr

如何删除最后出现的逗号,逗号本身可能不是SQL中String的最后一个字符

JavaScript重点记忆

C#:如何删除两个字符串之间的匹配子字符串?