假设我有以下数据,我必须更新表中的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 :)
答案 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)
REGEXP_REPLACE做到了。感谢所有参与/回复的人,但是,感谢所有批评的人,这不是我的代码,它是Datalife Engine Blog :)