mySQL,用新值替换第n个值

时间:2016-01-14 12:29:22

标签: mysql sql

我正在使用MySQL,我需要用<p>替换</p><p>的每个第n次出现。

我有以下内容用<p>替换所有<p></p>代码。但是我需要对其进行更新,以便仅在<p>的第二次或更多次更新时进行更新。

UPDATE dnname.products
SET description = REPLACE (description, '<p>', '<p></p>')

例如,描述中的当前值可能如下所示:

<p>test<p>test2

我需要它看起来像这样

<p>test</p><p>test2

巧合的是,我需要在每个值的开头插入<p>,并在每个值的末尾插入</p>。但这是针对不同的查询。

2 个答案:

答案 0 :(得分:1)

您可以替换所有匹配项,然后删除第一个匹配项。老实说,使用多个更新可能更容易。但是,像这样:

UPDATE dnname.products
    SET description = REPLACE(description, '<p>', '<p></p>');

UPDATE dnname.products
SET description = INSERT(description, LOCATE('<p></p>', description), 7,
                         '<p>', '<p></p>')
WHERE description like '%<p></p>%';

您可以将这些组合成一个更新:

UPDATE dnname.products
    SET description = INSERT(REPLACE(description, '<p>', '<p></p>'),
                             LOCATE('<p></p>', REPLACE(description, '<p>', '<p></p>')), 7,
                             '<p>', '<p></p>')
    WHERE description LIKE '%<p>%';

答案 1 :(得分:0)

我不相信有一个原生的mysql函数可以执行此操作,但您可以导出字段或表并尝试使用sed替换然后将其重新导入。

有更多优雅的解决方案,但您可以执行类似

的操作
mysqldump tablename > table.sql

完成后,您可以将<p>替换为<p></p>

sed 's/<p>/<p></p>/g' table.sql > almost-fixed.sql

然后你想再次修复第一位(有点在那里并且再次解决方案

sed 's/^<p></p>/<p>/g' almost-fixed.sql > fixed.sql

然后在

中重新运行
mysql yourdatabase < fixed.sql