7

以下は私のSQLフィドルです: http ://sqlfiddle.com/#!2/f9bae/1

名前全体がルックアップテーブルによって検証されているかどうかを確認しようとしていますが、エラーがある場合は正しい値に置き換える必要がありますが、私が直面している問題は、名前に複数の間違った名前が含まれている場合です次に、値をクエリすると、その名前の一部のみが更新され、残りは変更されません。ルックアップテーブルの正しい値に従って名前全体が更新されるように、クエリを変更して更新する方法を教えてください。

ありがとう、

4

2 に答える 2

2

これがSQLFIddleのデモです

この醜いクエリは、文字列内の最大4つの置換に対して機能します。さらに置換が必要な場合は、ユーザー定義関数を作成してこれらの単語を1つの文字列に置換し、それを使用して更新するのが最善の方法です。

 UPDATE table1 a 
  LEFT JOIN lookup b1 on a.username LIKE CONCAT('%', b1.`WRONG`, '%')
  LEFT JOIN lookup b2 on a.username LIKE CONCAT('%', b2.`WRONG`, '%') 
            and (b2.Wrong not in (b1.Wrong))
  LEFT JOIN lookup b3 on a.username LIKE CONCAT('%', b3.`WRONG`, '%') 
            and (b3.Wrong not in (b1.Wrong,b2.Wrong))
  LEFT JOIN lookup b4 on a.username LIKE CONCAT('%', b4.`WRONG`, '%') 
            and (b4.Wrong not in (b1.Wrong,b2.Wrong,b3.Wrong))

SET a.username = 
REPLACE(
  REPLACE(
      REPLACE(
           REPLACE(a.username, IFNULL(b1.`WRONG`,''), IFNULL(b1.`RIGHT`,''))
        , IFNULL(b2.`WRONG`,''), IFNULL(b2.`RIGHT`,''))
    , IFNULL(b3.`WRONG`,''), IFNULL(b3.`RIGHT`,''))
  , IFNULL(b4.`WRONG`,''), IFNULL(b4.`RIGHT`,''))
于 2012-12-12T11:19:53.073 に答える
0

セットアップでは、繰り返しを処理する更新を最大3回実行する方が簡単な場合があります。ちなみに、choudharyまたはchoudharyは、chodryと比較しておそらくより正しいです:)

http://sqlfiddle.com/#!2/2d4c6/1

編集:あるいは、このようにエントリが多すぎない場合は、ルックアップテーブルを取り除くことができます:-

http://sqlfiddle.com/#!2/890ea/1

于 2012-12-12T10:50:22.607 に答える