2012-08-25 49 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的初學者,這幾乎是我寫過的最難的查詢,所以可能會有一些低效率。它可以準確地完成工作。

相關問題