更新以仅更改字段值的左侧

时间:2019-04-09 02:54:32

标签: php mysql

我有一个表,其中包含文件的(虚拟)路径。在路径字段中,您可能会看到以下数据:

path
====
folder1
folder2
folder1/111
folder1/111/abc
folder1/111/abc/xyz
folder1/222

如果用户要将文件夹“ 111”(位于文件夹1中)移动到文件夹2,则它应同时移动其自身和任何嵌套文件夹(abc和xyz)。因此,我希望看到的结果如下:

path
====
folder1
folder2
folder2/111
folder2/111/abc
folder2/111/abc/xyz
folder1/222

我无法使用REPLACE()函数提出一种方法来专门指示字符串的左侧,但是确实提出了这一点:

update table set path = replace(path, 'folder1/', 'folder2/')
where path like 'folder1/111/%';

仅位于右侧的百分号只会修改以“ folder1 / 111 /”开头的行。但是,我对此有一个担心,就是路径是否像这样:

folder1/111/folder1/abc

然后,替换功能最终将两个folder1实例都替换为folder2。

注意:我将使用PHP创建mysql查询,因此也考虑过使用LEFT()函数。但是,我觉得我仍然缺少这种方法。

如何仅替换字段左侧显示的文本来有效地进行搜索和替换?

更新

基于以下答案之一,我想出了一些建议:

update Test as t,
    (select insert(path, locate('folder1', path), char_length('folder1'), 'folder2') as path from Test) as ins
     set t.path = ins.path
     where LEFT(t.path, 10) = 'folder1/111';

请参阅我的SQLFiddle

但是,我的问题是用'folder2'替换了整个路径,而不仅仅是路径的一部分。

我在做什么错了?

2 个答案:

答案 0 :(得分:1)

如果LEFT()没有给您结果,您可以尝试其他String函数来获得相同的结果。

select path,INSERT(path, LOCATE('folder1', path), CHAR_LENGTH('folder1'), 'folder2')
from yourtable;

我给出了select查询。您可以相应地使用update

提琴:SQLFIDDLE

文档参考:LOCATE()INSERT()CHAR_LENGTH()

UPDATE

update Test set path = INSERT(path, LOCATE('folder1', path), CHAR_LENGTH('folder1'), 'folder2')
where path like 'folder1/111/%';

提琴:For Update

答案 1 :(得分:0)

update table path = replace(path, 'folder1', 'folder2') 
where path like 'folder1/111%'