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

时间:2018-10-29 14:04:36

标签: sql sql-server sql-server-2012 substring

我有一些像这样的字符串:

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

我需要删除年份值(在最后2个“ @”之间)。 所以结果应该像:

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

有一个简单的查询可以做到吗?

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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

请注意,此答案假设每个记录中都将包含三个@分隔符。如果没有,那么我们将不得不添加其他逻辑。

答案 2 :(得分: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