我有一个表,其中包含文件的(虚拟)路径。在路径字段中,您可能会看到以下数据:
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'替换了整个路径,而不仅仅是路径的一部分。
我在做什么错了?
答案 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%'