繁体   English   中英

在mysql中使用正则表达式替换表中的列值

[英]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

基于此答案:

等效于explode()以在MySQL中使用字符串

您想要这样的东西,它与组匹配:

WHERE REGEXP 'second:([0-9]*):third'

但是,MySQL没有正则表达式替换功能,因此您必须使用用户定义的功能:

REGEXP_REPLACE?(text, pattern, replace [,position [,occurence [,return_end [,mode]]])

用户定义的功能在此处可用:

http://www.mysqludf.org/lib_mysqludf_preg/

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM