[英]Replace a column value in a table using regex in mysql
我需要执行以下操作,并且我在语法上苦苦挣扎:
我有一个名为“ mytable”的表和一个名为“ mycolumn”(字符串)的列。
在mycolumn中,该值为构造值-例如,其中一个值为:“ first:10:second:18:third:31”。 mycolumn中的值都使用相同的模式,只是id /数字不同。
我需要将值18(在这种情况下)更改为另一个表键的值。 该列值的最终结果应为“ first:10:second:22:third:31”,因为我用22替换了18。我从另一个表中获取了22,并使用18作为查找值。
因此,理想情况下,我将具有以下内容:
UPDATE mytable
SET mycolumn = [some regex function to find the number between 'second:' and ":third" -
let's call that oldkey - and replace it with other id from another table -
(select otherid from tableb where id = oldkey)].
我知道mysql有一个REPLACE函数,但是那还不够。
您可以创建自己的函数。 我担心REGEX,所以我使用SUBSTRING和SUBSTRING_INDEX。
CREATE FUNCTION SPLIT_STRING(str VARCHAR(255), delim VARCHAR(12), pos INT)
RETURNS VARCHAR(255)
RETURN REPLACE(SUBSTRING(SUBSTRING_INDEX(str, delim, pos),
LENGTH(SUBSTRING_INDEX(str, delim, pos-1)) + 1),
delim, '');
SPLIT_STRING('first:10:second:18:third:31', ':', 4)
返回18
基于此答案:
您想要这样的东西,它与组匹配:
WHERE REGEXP 'second:([0-9]*):third'
但是,MySQL没有正则表达式替换功能,因此您必须使用用户定义的功能:
REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]])
用户定义的功能在此处可用:
MySQL的问题在于它的REGEX风格非常有限,并且不支持反向引用或regex替换,这几乎使得无法像单独使用MySQL那样替换所需的值。
我知道这意味着加快速度,但是您可能要考虑通过其ID选择想要的行,或者选择该行,然后使用PHP或与MySQL接口的任何语言修改值,然后使用UPDATE查询。
一般来说,编程语言中的REGEX功能要强大得多。
如果您将这些查询保持精简和快速,那么您不应受到太大的影响(可能忽略不计)。
另外,这里是有关MySQL的REGEX可以做什么的文档。 http://dev.mysql.com/doc/refman/5.1/en/regexp.html
干杯
编辑:
坦白地说,eggyal的注释对于您的情况(简单的int值)更加有意义。 只需将它们分成几列,就没有理由像在所有imo上那样访问它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.