2012-10-09 65 views
1

要求是基於美國英語詞典中的列值替換區分大小寫的文本MySQL的函數替換文本保持不變的情況下

下面是

Colour => color 
Color => Color (note that C is capitalized here) 

FIBRE => FIBER 

Colour/Monochrome => Color/Monochrome 
+0

會假設你已經有一個表,從挑的話,看你嘗試過到現在? – Anshu

+0

是的,但它正在取代但不保留案例 –

回答

1

此功能聲稱工作的樣品,雖然我沒有選中,但在another question用戶接受了這個答案爲

http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/

讓我硝酸鉀◆如果這是行不通的

+0

功能在替換方面起作用,但不保留案例 –

+0

功能在替換方面起作用,但它不保留例如。顏色=>顏色。我有一本我替換的字典。如果Color發現它被替換爲顏色,則替換功能完好但情況有誤 –

+0

是否有任何其他解決方案? –

0

試試這個:

DELIMITER $$ 
DROP FUNCTION IF EXISTS `replace_ci`$$ 
CREATE FUNCTION `replace_ci` (str TEXT, needle CHAR(255), str_rep CHAR(255)) 
    RETURNS TEXT 
    DETERMINISTIC 
    BEGIN 
     DECLARE return_str TEXT DEFAULT ''; 
     DECLARE lower_str TEXT; 
     DECLARE lower_needle TEXT; 
     DECLARE pos INT DEFAULT 1; 
     DECLARE old_pos INT DEFAULT 1; 
     SELECT lower(str) INTO lower_str; 
     SELECT lower(needle) INTO lower_needle; 
     SELECT locate(lower_needle, lower_str, pos) INTO pos; 
     WHILE pos > 0 DO 
      SELECT concat(return_str, substr(str, old_pos, pos-old_pos), str_rep) INTO return_str; 
      SELECT pos + char_length(needle) INTO pos; 
      SELECT pos INTO old_pos; 
      SELECT locate(lower_needle, lower_str, pos) INTO pos; 
     END WHILE; 
     SELECT concat(return_str, substr(str, old_pos, char_length(str))) INTO return_str; 

     /** mirror the case **/ 
     IF (BINARY LEFT(str,1) = LOWER(LEFT(str,1))) THEN 
      SET return_str = LOWER(return_str); 
     ELSE 
      IF (BINARY LEFT(str,2) = UPPER(LEFT(str,2))) THEN 
       SET return_str = UPPER(return_str); 
      ELSE   
       SET return_str = CONCAT(UPPER(LEFT(return_str,1)), LOWER(RIGHT(return_str, LENGTH(return_str) - 1))); 
      END IF; 
     END IF; 

     RETURN return_str; 
END$$ 
DELIMITER ; 

我已經修改了不區分大小寫的替換功能(這是在對方的回答中提到),以「鏡子」原始字符串

的情況下,

(請參閱/ **鏡像後的代碼段** /)。

然而,只有3個場景檢查 - 輸入字符串要麼

  • 小寫
  • 大寫
  • 第一個字母大寫

但它應該爲這三個場景中工作 - 即

FIBER => FIBER

纖維=>纖維

纖維=>纖維

相關問題