2012-08-25 5 views
9

私はpost_content列にhtmlコンテンツを持っています。SQL:検索/置換が、レコードに最初に値が表示されるときのみ

AをBで検索して置き換えたいのですが、最初にAが複数回表示される可能性があるため、レコードにAが表示されます。

UPDATE wp_posts SET post_content = regexp_replace(post_content,'A','B',1,1) 

参照:

以下のクエリでは、明らかにあなたは、Oracle DBを使用している場合は、あなたのような何かを書くことができるはずBと

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)); 

それは少し複雑私の以前の回答よりもだ - あなたは(INSTR関数を使用して)「A」の最初のインスタンスを見つける必要があり、その後、 REPLACEと組み合わせてLEFTを使用するだけで、そのインスタンスを置き換えることができます.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; 

が生成されます保つために

INSERT(originalvalue, LOCATE('A', originalvalue), CHAR_LENGTH('A'), 'B') 
+4

これは文字列が1文字:( – Radek

7

、あなたは、関数には、このようなINSERT()CHAR_LENGTH()LOCATE()を使用することができます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

:また

actual_string         new_string 
--------------------------------------------- --------------------------------------------- 
this is A string with A replace and An Answer this is B string with A replace and An Answer 
0

グレッグ・レダのソリューションは、(理由REPLACE方法の1つの文字を超える文字列で私のために動作しませんでした)(のみ置き換えられる文字列の最初の文字を置き換える)書かれていました。ここでは、より完全であり、問​​題のすべてのケースをカバーすると信じているソリューションです。「文字列A」の最初のオカレンスを「文字列C」の「文字列B」に置き換えるにはどうすればよいですか?

CONCAT(LEFT(buycraft, INSTR(buycraft, 'blah') - 1), '', SUBSTRING(buycraft FROM INSTR(buycraft, 'blah') + CHAR_LENGTH('blah'))) 

これは、エントリがすでに交換する文字列が含まれていることを確認していることを前提として!文字列 'pupper'の中で 'dog'を 'cat'と置き換えようとすると、 '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」を置き換えるの例のウォークスルー: 'pupper' の

  1. 指数は 'lil_'
  2. 'lil_dog' の連結し '犬' であるインデックス1-4、だから5
  3. は5-1 = 4の左GETです
  4. 終了インデックスを計算します。開始インデックスは5で、5 +長さは 'pupper' = 11です。インデックス11は 's'を指しています。
  5. 's_yay'である終了インデックスで始まる部分文字列を連結して 'lil_dogs_yay'を取得します。

すべて完了!

注: SQLには1つのインデックス付き文字列があります(SQL初心者の方は、この問題を理解する前にこれを知りませんでした)。また、SQL LEFTとSUBSTRINGは、理想的な方法で無効なインデックスを使用するように見えます(文字列の先頭または末尾に調整する)。これは、私のような初心者のSQLerにとって非常に便利です:P

別の注意:私はSQLの初心者ですが、これは私が今までに書いたことのない最も難しいクエリですので、非効率的なものがあります。しかし、それは正確に仕事を得る。

関連する問題