我在post_content列中有html内容。SQL:搜索/替换,但只有第一次出现在记录中的值
我想用B搜索和替换A,但只有第一次出现在记录中,因为它可能会出现多次。
下面的查询将明显为B取代A的所有实例
UPDATE wp_posts SET post_content = REPLACE (post_content, 'A', 'B');
我在post_content列中有html内容。SQL:搜索/替换,但只有第一次出现在记录中的值
我想用B搜索和替换A,但只有第一次出现在记录中,因为它可能会出现多次。
下面的查询将明显为B取代A的所有实例
UPDATE wp_posts SET post_content = REPLACE (post_content, 'A', 'B');
其实,这应该是你想要的东西在MySQL:
UPDATE wp_post
SET post_content = CONCAT(REPLACE(LEFT(post_content, INSTR(post_content, 'A')), 'A', 'B'), SUBSTRING(post_content, INSTR(post_content, 'A') + 1));
这是稍微复杂一些比我早的答案 - 你需要找到的“A”的第一个实例(使用INSTR函数),然后使用LEFT和REPLACE组合替换刚才那个实例,比使用SUBSTRING和INSTR找到你要替换的'A'并且用前一个字符串进行CONCAT。
见我的测试如下:
SET @string = 'this is A string with A replace and An Answer';
SELECT @string as actual_string
, CONCAT(REPLACE(LEFT(@string, INSTR(@string, 'A')), 'A', 'B'), SUBSTRING(@string, INSTR(@string, 'A') + 1)) as new_string;
产地:
actual_string new_string
--------------------------------------------- ---------------------------------------------
this is A string with A replace and An Answer this is B string with A replace and An Answer
这似乎不适用于长于一个字符的字符串:( – Radek
如果您使用的是Oracle数据库,你应该能够写类似:
UPDATE wp_posts SET post_content = regexp_replace(post_content,'A','B',1,1)
见这里获得更多信息:http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions130.htm
注意:你真的应该照顾post_content
关于安全问题,因为它似乎是用户输入。
或者,你可以使用的功能LOCATE(),INSERT()和CHAR_LENGTH()这样的:
INSERT(originalvalue, LOCATE('A', originalvalue), CHAR_LENGTH('A'), 'B')
为了保持gjreda的样本更简单一些,使用这个:
UPDATE wp_post
SET post_content =
CONCAT(
REPLACE(LEFT(post_content, 1), 'A', 'B'),
SUBSTRING(post_content, 2)
)
WHERE post_content LIKE 'A%';
格雷格·里达的解决方案并没有为我工作的字符串长度超过1个字符,因为如何替换()写(只替换的字符串的第一个字符来代替)。我认为这是一个更完整的解决方案,涵盖了每个使用案例的定义为如何在“字符串C”中用“字符串B”替换第一次出现的“字符串A”?
CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah')))
这是假定你是确保进入已经包含TO BE REPLACED串!如果你尝试在'pupper'字符串中用'cat'代替'dog',它会给你'per',这不是你想要的。这里是处理一个查询,先检查,看看是否被替换字符串中的满弦存在:
IF(INSTR(buycraft, 'blah') <> 0, CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah'))), buycraft)
具体使用情况而这里更换的“嗒嗒”一审列“buycraft”内用空字符串''。我认为一个非常直观和自然的解决方案:
在“lil_puppers_yay”与“狗”取代“pupper”的一个实例演练:
全部完成!
注意: SQL有1索引的字符串(作为一个SQL初学者,在我想出这个问题之前我不知道这一点)。此外,SQL LEFT和SUBSTRING似乎与无效索引工作的理想方式(它调整到无论是开始或结束的字符串),这是一个初学者SQLer像我这样的超级方便:P
另注:我是SQL的初学者,这几乎是我写过的最难的查询,所以可能会有一些低效率。它可以准确地完成工作。
哪个数据库? –
mysql数据库@gjreda谢谢你的解释。 – stemie
即时通讯使用MySQL数据库。 @gjreda谢谢,我试过这个查询,但得到一个错误。 #1064 - 你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'UPDATE wp_posts SET post_content = REPLACE(SUBSTRING_INDEX(post_content,'A','在第1行 – stemie