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

问题描述 投票:1回答:3

我有一些字符串:

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

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

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

有一个简单的查询吗?

sql sql-server sql-server-2012 substring
3个回答
0
投票

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

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

enter image description here

Demo

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


1
投票
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)

0
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.