MySQL搜索并删除字段中的一些文本

时间:2019-04-20 17:30:31

标签: mysql sql

假设我有以下数据,我必须更新表中的2个字段:

Date          CategoryID
2019-04-19    1,92,10
2019-04-18    4,105,10
2019-04-17    3,106,7,78
2019-04-16    3,108,10

如果行中有/,我必须更新CategoryID并删除以下类别编号:106、107、108和92

因此结果将是:

Date          CategoryID
2019-04-19    1,10
2019-04-18    4,105,10
2019-04-17    3,7,78
2019-04-16    3,10

通常我使用REPLACE函数,但是在这种情况下,我不知道如何使用它来删除该类别并保留其他类别。 有人可以开车送我吗? 谢谢卢卡斯

编辑:来自@Joakim Danielson的REGEXP_REPLACE做到了。感谢所有参与/回复的人,但是,感谢所有批评的人,这不是我的代码,它是Datalife Engine Blog :)

4 个答案:

答案 0 :(得分:2)

我使用具有两个相似模式的REGEXP_REPLACE,但前后使用逗号,,以支持数字的第一个,最后一个或其中的某个位置。中间

UPDATE test
SET categoryID = REGEXP_REPLACE(categoryID, '((106|107|108|92)([,]{1}))|(([,]{1})(106|107|108|92))', '')

此查询在某种程度上受到限制,因为它将替换例如106和1060。这是问题还是ID的范围有限,这样就足够了吗?


由于我认为这是一次性的事情,因此您可以将其分为3个不同的更新,以确保仅获得准确的匹配

-- id in the middle
UPDATE test 
SET categoryID = REGEXP_REPLACE(categoryID, ',(106|107|108|92),', ',')

-- id at the start
UPDATE test
SET categoryID = REGEXP_REPLACE(categoryID, '^(106|107|108|92),', '')

-- id at the end
UPDATE test
SET categoryID = REGEXP_REPLACE(categoryID, ',(106|107|108|92)$', '')

答案 1 :(得分:1)

您可以使用多个替换调用,即首先对每个数字运行查询,并在其后加一个逗号。即它将用空字符串替换107。

然后将每个数字作为单个条目运行查询。即用空字符串替换107。

在两种情况下,请注意部分匹配。因此,如果将97替换为空字符串,则ID 197也将更改为1。或者,如果将97替换为空字符串,则可能会将197,4更改为14。

答案 2 :(得分:0)

那是一个可怕的模式,至少用于关系数据库中。

但是,要获得您的要求,请查看是否可行:

UPDATE thetable
SET CategoryID = "1,10"
WHERE Date = "2019-04-19"

要实现此目的,必须通过一种编程语言来生成sql查询,该语言可以检查字符串,并可以通过其他方式找出要更新的行。

答案 3 :(得分:0)

@ p.Joakim Danielson的

REGEXP_REPLACE做到了。感谢所有参与/回复的人,但是,感谢所有批评的人,这不是我的代码,它是Datalife Engine Blog :)