2016-08-22 7 views
0

以下に示すように、MySQLのエントリを再処理する方法はありますか? (大文字の文字の前にスペースを入れる)私はこれに対する答えを考えることはできませんし、SQLは本当にこの種のもののために作られていないようです。すべてのアイデアを感謝!大文字小文字で区切られた文字列操作MySQL

入力例:
| id |文字列|
| 1 |ファニーメイ|
| 2 |フレディマック|
| 3 |アーサーアンダーセン|

出力例:

| id |文字列|
| 1 |ファニーメイ|
| 2 |フレディマック|
| 3 |アーサー・アンデルセン|

+0

私は、MySQLで単純にこれを行うことが可能であるとは思いません正規のものを使用することができる置換機能の種類が必要です置換する部分文字列を見つけるための式で、MySQLにはこの機能がありません。もちろん、期待通りの結果を得るために、多くの 'replace()'呼び出しを互いに組み込むことができますが、これはかなり面倒な作業です。 – Shadow

+0

良い点。私は、アルファベットの各文字の代わりに(文字列、 'A'、 'A')のように26の文を置換することができます。 – OctaveParango

+0

またはhttps://stackoverflow.com/questions/25938516/mysql- regex-do-a-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 

注意BINARYとしてCHの宣言 - 大文字と小文字を区別する比較を強制するが。

次に使用

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

機能を使用せずに、言及するのを忘れました。しかし、あなたの時間のおかげで! – OctaveParango

関連する問題