2

我需要执行以下操作,并且正在为语法苦苦挣扎:

我有一个名为“mytable”的表和一个名为“mycolumn”(字符串)的列。

在 mycolumn 中,该值是一个构造值 - 例如,其中一个值是:'first:10:second:18:third:31'。mycolumn 中的值都使用相同的模式,只是 ids/numbers 不同。

我需要将 18 的值(在这种特殊情况下)更改为来自另一个表键的值。此列值的最终结果应该是“first:10:second:22:third:31”,因为我将 18 替换为 22。我使用 18 作为查找值从另一个表中获得了 22。

因此,理想情况下,我将拥有以下内容:

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 功能,但这还不够。

4

3 回答 3

1

MySQL 的问题是它的 REGEX 风格非常有限,不支持反向引用或正则表达式替换,这几乎使得无法像单独使用 MySQL 那样替换值。

我知道这意味着速度会受到影响,但您可能需要考虑通过它的 id 选择您想要使用的行,或者无论您选择它,使用 PHP 或您与 MySQL 连接的任何语言修改值,然后用更新查询。

一般来说,编程语言中的 REGEX 要强大得多。

如果您使这些查询保持苗条和快速,那么您不应该对速度造成太大影响(可能可以忽略不计)。

此外,这里是关于 MySQL 的 REGEX 可以做什么的文档。http://dev.mysql.com/doc/refman/5.1/en/regexp.html

干杯

编辑:

老实说,eggyal 的评论对您的情况更有意义(简单的 int 值)。只需将它们分成几列,就没有理由像那样访问它们。

于 2012-06-29T18:10:02.713 回答
1

您可以创建自己的函数。我害怕 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

基于这个答案:

等价于在 MySQL 中处理字符串的 explode()

于 2012-06-29T18:25:56.257 回答
1

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

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

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

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

用户定义的函数在这里可用:

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

于 2012-06-29T18:06:07.643 回答