7

以下是我的 SQL 小提琴: http ://sqlfiddle.com/#!2/f9bae/1

在其中我试图检查整个名称是否正在通过查找表进行验证,如果有任何错误,那么它应该被正确的值替换,但我面临的问题是,如果任何名称包含多个错误values 然后查询只更新该名称的一部分,其余部分保持不变,请告诉我如何修改我的查询以进行更新,以便它会根据查找表的正确值更新整个名称。

谢谢,

4

2 回答 2

2

这是一个SQLFiddle 演示

这个 UGLY 查询适用于一个字符串中最多 4 个替换。如果您需要更多替换,最好的方法是创建一个用户定义函数来替换一个字符串中的这些单词并使用它来更新。

 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 次更新可能会更容易,这将处理重复。在旁注中,与 chodry 相比,chaudhary 或 choudhary 可能更正确:)

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

编辑:或者,如果您没有太多这样的条目,您可以摆脱查找表:-

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

于 2012-12-12T10:50:22.607 回答