我在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