2016-08-22 54 views
0

有沒有辦法重新處理MySQL中的條目,如下所示? (在大寫字符之前放置一個空格)我想不出這個問題的答案,並且看起來SQL並不是真正爲這種東西構建的。任何想法讚賞!大小寫分隔字符串操作MySQL

示例輸入:
| id |字符串|
| 1 | FannieMae |
| 2 | FreddyMac |
| 3 |阿瑟安德森|

示例輸出:

| id |字符串|
| 1 |聯邦抵押協會|
| 2 |弗雷迪麥克|
| 3 |亞瑟安徒生|

+0

我不認爲這是可能在MySQL簡單地做到這一點,因爲你會需要一種可以使用常規的替換功能用於查找替換子字符串的表達式,MySQL不具備此功能。顯然,你可以嵌入儘可能多的'replace()'調用,以達到預期的結果,但這是一項非常繁瑣的練習。 – Shadow

+0

好點。我可以嵌套26替換語句作爲替換(字符串,'A','A')爲每個字母的字母..聽起來像我唯一的選擇:) – OctaveParango

+0

或https://stackoverflow.com/questions/25938516/mysql- udf-that-do-regex-search-and-replace –

回答

1

此功能會做你想要什麼:

DELIMITER $$ 

CREATE FUNCTION `InsertSpace`(s1 VARCHAR(1000))  
RETURNS varchar(1000) 
BEGIN 
    DECLARE rs VARCHAR(1000); 
    DECLARE ch BINARY; 
    DECLARE i int; 
    SET rs = SUBSTRING(s1,1,1); 
    SET i = 2; 
    label1: LOOP 
    SET ch = SUBSTRING(s1,i,1); 
    IF ((ch >= 'A') AND (ch <= 'Z')) THEN 
     SET rs = CONCAT(rs, ' '); 
    END IF; 
    SET rs = CONCAT(rs, ch); 
    SET i = i + 1; 
    IF i > LENGTH(s1) THEN 
     LEAVE label1; 
    END IF; 
    END LOOP label1; 
    RETURN rs; 
END 

注ch的聲明爲BINARY - 強制區分大小寫的比較。

然後使用

UPDATE myTable SET `String`=InsertSpace(`String`); 
+0

woops忘記提及,不使用功能。但是,謝謝你的時間! – OctaveParango

1
create table stuckTogether 
( id int auto_increment primary key, 
    String varchar(200) not null 
); 
insert stuckTogether(String) values 
('FannieMae'), 
('FreddyMac'), 
('ArthurAndersen'), 
('DJMurphyZ'); 

功能:

DROP FUNCTION IF EXISTS separateStuck; 
DELIMITER $$ 
CREATE FUNCTION separateStuck 
( s VARCHAR(200) 
) 
RETURNS VARCHAR(200) 
BEGIN 
    DECLARE sOut VARCHAR(200) DEFAULT ''; 
    DECLARE iSize,iPos INT; 
    SET iSize=LENGTH(s); 
    SET iPos=1; 

    label1: WHILE iPos<=iSize DO 
     SET sOut=CONCAT(sOut,SUBSTRING(s,iPos,1)); 
     IF ASCII(SUBSTRING(s,iPos,1)) BETWEEN 97 and 122 THEN 
      -- it is lowercase 
      IF iPos<iSize THEN 
       IF ASCII(SUBSTRING(s,iPos+1,1)) BETWEEN 65 and 90 THEN 
        -- the next one is upper case 
        SET sOut=CONCAT(sOut,' '); 
       END IF; 
      END IF; 
     END IF; 
     SET iPos=iPos+1; 
    END WHILE label1; 

    RETURN sOut; 
END;$$ 
DELIMITER ; 

測試:

select id,separateStuck(String) as String 
from stuckTogether; 

+----+-----------------+ 
| id | String   | 
+----+-----------------+ 
| 1 | Fannie Mae  | 
| 2 | Freddy Mac  | 
| 3 | Arthur Andersen | 
| 4 | DJMurphy Z  | 
+----+-----------------+ 
+0

woops忘記提及,不使用功能。但是,謝謝你的時間! – OctaveParango