2012-12-12 103 views
7

以下是我的SQL小提琴: http://sqlfiddle.com/#!2/f9bae/1更新不更新整個字符串

在這我試圖檢查全名是由查表驗證或沒有,如果有任何錯誤,那麼它應該被正確的值取代,但我面臨的問題是,如果任何名稱包含多個錯誤的值,那麼查詢只更新該名稱的一部分,並保持不變的其餘部分,請讓我知道如何修改我的查詢更新所以它會根據查找表的正確值更新整個名稱。

感謝,

回答

2

這裏是一個SQLFIddle demo

這個醜陋的查詢工作在一個字符串最多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`,'')) 
+0

非常感謝您的幫助! :) –

0

您的設置可能會更容易只運行更新高達3倍,這將處理重複。在一個側面說明喬杜裏或CHOUDHARY相比chodry :)

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

編輯也許是更正確的:或者你可以擺脫查找表的,如果你沒有太多的條目有這樣的: -

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

+0

不,它應該由我的一個查詢來完成,因爲一些名稱包含四個組合,一些名稱是五個。所以,如果我去爲它,這將是最糟糕的情況....: - ] –

+0

如果你沒有太多的更正,你可以嘗試把它們放在一個替換。 – Himanshu