如何替换mysql中的子串,其中string基于其他表列值

时间:2014-05-23 10:18:14

标签: mysql

我有两个mysql表

Component
+----+-------------------------+--------+
| OldComponentId | NewComponentId       |
+----+-------------------------+--------+
|  15        |                  85      |
|  16        |                  86      |
|  17        |                  87      |
+----+-------------------------+--------+

Formulae
+----+-------------------------+--------+
| id         | formula_string           |
+----+-------------------------+--------+
|  1         |    A+15-16+17            |
|  2         |    16+15-17              |
+----+-------------------------+--------+

I want to replace value of formula_string on the basis of NewComponentId as


Formulae
+----+-------------------------+--------+
| id         | formula_string           |
+----+-------------------------+--------+
|  1         |    A+85-86+87            |
|  2         |    86+85-87              |
+----+-------------------------+--------+

我尝试过以下mysql查询,但它无法正常工作

更新公式fr,组件comp set formula_string = REPLACE(fr.formula_string,comp.OldComponentId,comp.NewComponentId)。

请建议解决方案

感谢。

1 个答案:

答案 0 :(得分:0)

没有简单的方法可以做到这一点。正如您在更新声明中所观察到的那样,替换不会嵌套。他们只是一次更换一个。

您可以做的一件事是:

update Formulae fr cross join
       Component comp
    set formula_string = REPLACE(fr.formula_string, comp.OldComponentId, comp.NewComponentId)
    where formula_string like concat('%', comp.OldComponentId, '%')

然后继续运行此操作,直到row_count()返回0

请注意,您的结构可能会导致无限循环(如果A - > B和B - > A)。你也有一个混乱的问题"所以10将被替换为100.这表明您的整体数据结构可能不正确。也许你应该将公式分解成单独的部分。如果它们只是数字+-,则可以使用包含每个组件的值和符号的联结表。然后你的查询就会容易得多。