我有一些像这样的字符串:
0@11001@2017@308
0@1@2018@327
0@200510@2020@3022
我需要删除年份值(在最后2个“ @”之间)。 所以结果应该像:
0@11001@308
0@1@327
0@200510@3022
有一个简单的查询可以做到吗?
答案 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));
请注意,此答案假设每个记录中都将包含三个@
分隔符。如果没有,那么我们将不得不添加其他逻辑。
答案 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