【问题标题】:SQL String - remove a substring between 2 occurencesSQL 字符串 - 删除两次出现之间的子字符串
【发布时间】:2019-04-02 11:41:41
【问题描述】:

我有一些字符串,例如:

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

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

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

有简单的查询吗?

【问题讨论】:

  • 为什么要将多个信息存储在一个列中?
  • 你的 dbms 是什么?我建议你在服务层而不是 db 中这样做
  • @a_horse_with_no_name 对 MySQL 不利?
  • 是 SQL Server 2012
  • 你的 sql server 版本是多少?

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


【解决方案1】:

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

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

Demo

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

【讨论】:

  • 第二个子串也可以是4个字符,可以是0@2005@2020@3022。有没有办法获取最后一个“@”字符的索引然后删除它?
  • 这有危险。列表中的第二项似乎长度不同。如果它有四位数长,则此代码将替换它而不是第三项。
  • I need to remove the year value ... 在@ 符号之间有可能超过 一年的价值吗?这似乎不太可能。
  • @MatBailie 我修好了。我想。现在答案没有假设一年的长度,而是@ 标记给出的位置。
  • @MarkKram 是的......这就是为什么这个问题值得回答(尽管许多人会投票关闭它)。但是,恕我直言,我们仍然应该在这里推动最佳数据库实践。
【解决方案2】:
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)

【讨论】:

  • 我非常喜欢这些解决方案。
  • 请不要在我的回答下宣传自己的回答,谢谢。
  • @TimBiegeleisen - 你的意思是我对你的回答的评论?如果您希望我删除/移动它,我很抱歉并且会这样做...
【解决方案3】:
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

【讨论】:

    猜你喜欢
    • 2013-03-03
    • 2016-07-01
    • 1970-01-01
    • 2012-05-14
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    相关资源
    最近更新 更多