【问题标题】:Replace a column value in a table using regex in mysql在mysql中使用正则表达式替换表中的列值
【发布时间】:2012-07-01 06:37:04
【问题描述】:

我需要执行以下操作,但我正在努力使用语法:

我有一个名为“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 功能,但这还不够。

【问题讨论】:

  • 为什么将数据存储在这些分隔字符串中?你不能把它们分成各自的列吗?
  • 是的,我同意,但我正在处理数据库中的一些遗留问题。

标签: mysql sql regex


【解决方案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/

【讨论】:

  • 我认为这让我更接近(也许?)但我真正想要的是找到这些数字并替换它们。像这个简单的例子(我只是用 16 替换数字......但这不起作用,因为 REGEX 只返回 1 或 0 - 匹配的真或假): SELECT REPLACE(mycolumn, mycolumn REGEXP 'second: ([0-9]*):third', '16') 来自讨论;
  • @ArthurFrankel 给你,launchpad.net/mysql-udf-regexp。这是一个用户定义的正则表达式替换函数。
  • 这是另一个似乎更容易安装的:mysqludf.org/lib_mysqludf_preg
  • 谢谢,我决定使用@AllInOne 的答案,因为我必须跳过障碍才能在此迁移脚本的生产框中获得此功能。对我来说,拥有一个基本功能更容易。感谢您的帮助。
【解决方案2】:

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

基于这个答案:

Equivalent of explode() to work with strings in MySQL

【讨论】:

  • 谢谢。我决定采纳你的答案并将其与 mysql 中的 CONCAT 函数一起使用来重新创建这个复合字符串。
【解决方案3】:

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

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

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

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

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

干杯

编辑:

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

【讨论】:

  • 它是遗留的一部分,但实际上该列的值被用作外部系统的键,因此将其保留为一个字段是最好的(性能)。感谢您的回答。
猜你喜欢
  • 1970-01-01
  • 2011-03-29
  • 2011-03-10
  • 2023-01-11
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多