2012-08-25 113 views
9

我在post_content列中有html内容。SQL:搜索/替换,但只有第一次出现在记录中的值

我想用B搜索和替换A,但只有第一次出现在记录中,因为它可能会出现多次。

下面的查询将明显为B取代A的所有实例

UPDATE wp_posts SET post_content = REPLACE (post_content, 'A', 'B');

+0

哪个数据库? –

+0

mysql数据库@gjreda谢谢你的解释。 – stemie

+0

即时通讯使用MySQL数据库。 @gjreda谢谢,我试过这个查询,但得到一个错误。 #1064 - 你的SQL语法错误;检查与您的MySQL服务器版本相对应的手册,以便在'UPDATE wp_posts SET post_content = REPLACE(SUBSTRING_INDEX(post_content,'A','在第1行 – stemie

回答

13

其实,这应该是你想要的东西在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 
+4

这似乎不适用于长于一个字符的字符串:( – Radek

7

或者,你可以使用的功能LOCATE()INSERT()CHAR_LENGTH()这样的:

INSERT(originalvalue, LOCATE('A', originalvalue), CHAR_LENGTH('A'), 'B') 
-1

为了保持gjreda的样本更简单一些,使用这个:

UPDATE wp_post 
    SET post_content = 
      CONCAT(
       REPLACE(LEFT(post_content, 1), 'A', 'B'), 
       SUBSTRING(post_content, 2) 
      ) 
    WHERE post_content LIKE 'A%'; 
0

格雷格·里达的解决方案并没有为我工作的字符串长度超过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”内用空字符串''。我认为一个非常直观和自然的解决方案:

  1. 找到第一次出现的字符串将被替换的索引。
  2. 把所有东西都放在左边,不包括索引本身(因此'-1')。
  3. 与任何你用原来的字符串替换的连接。
  4. 计算被替换的字符串部分的结尾索引。这很容易通过再次找到第一次出现的索引并添加替换字符串的长度来完成。这会给你的第一个字符的索引原始字符串
  5. 串连的子开始的字符串的结束索引处后

在“lil_puppers_yay”与“狗”取代“pupper”的一个实例演练:

  1. 'pupper' 的指数5
  2. 被甩的5-1 = 4。所以索引1-4,这是 'lil_'
  3. 串连 '狗' 的 'lil_dog'
  4. 计算结束索引。开始索引是5,“pupper”的长度是5+。请注意,索引11指的是's'。
  5. 连接从结尾索引处开始的子字符串's_yay',以获得'lil_dogs_yay'。

全部完成!

注意: SQL有1索引的字符串(作为一个SQL初学者,在我想出这个问题之前我不知道这一点)。此外,SQL LEFT和SUBSTRING似乎与无效索引工作的理想方式(它调整到无论是开始或结束的字符串),这是一个初学者SQLer像我这样的超级方便:P

另注:我是SQL的初学者,这几乎是我写过的最难的查询,所以可能会有一些低效率。它可以准确地完成工作。

相关问题