2016-08-25 9 views
1

すべてのレコードにランダムな文字がある場合、すべての文字の後にコンマを追加するにはどうすればよいですか?データベース内の文字のランダムな文字の各文字の後にコンマを追加する方法

私が持っているもの:

1. AHGJTOSIYGJ 
2. OTPDBSKGY 
3. HFRYEC 
4. OPFKWIFS 
// etc 

私が必要なもの:

1. A, H, G, J, T, O, S, I, Y, G, J, 
2. O, T, P, D, B, S, K, G, Y, 
3. H, F, R, Y, E, C, 
4. O, P, F, K, W, I, F, S, 
// etc 
+1

[正規表現を行う方法は?](http://stackoverflow.com/questions/986826/how-to-do-a-regular-expression-replace-in-mysql) – Jens

答えて

3

これらの操作は、DBではなくアプリケーションレベルで行う必要があります。しかし、あなたは本当にDBレベルからこれをやりたがっていますが、ユーザ定義関数を使って簡単に行うことができます。ここでは、この

delimiter // 

create function myFunction(myString varchar(255)) 
returns varchar(255) 
begin 
declare strLen int ; 
declare lookupChar char(1); 
declare finalString varchar(255); 
declare x int; 

set strLen = length(myString); 
set x = 1 ; 
set finalString = ''; 
while x <= strLen do 
    set lookupChar = substring(myString,x,1); 
    if finalString = '' then 
    set finalString = lookupChar; 
    else 
    set finalString = concat(finalString,',',lookupChar); 
    end if; 
    set x = x+1; 
end while; 
return finalString; 
end// 

delimiter; 

できますが、mysqlの

mysql> create table mytable (id int, value varchar(100)); 
Query OK, 0 rows affected (0.19 sec) 

mysql> insert into mytable values (1,'AHGJTOSIYGJ'),(2,'OTPDBSKGY'),(3,'HFRYEC'),(4,'OPFKWIFS'); 
Query OK, 4 rows affected (0.02 sec) 

mysql> select * from mytable ; 
+------+-------------+ 
| id | value  | 
+------+-------------+ 
| 1 | AHGJTOSIYGJ | 
| 2 | OTPDBSKGY | 
| 3 | HFRYEC  | 
| 4 | OPFKWIFS | 
+------+-------------+ 
4 rows in set (0.00 sec) 

でこれを実行しないための機能は、今、今使用して値を選択することができますので、良い今のところ機能

mysql> delimiter // 
mysql> create function myFunction(myString varchar(255)) 
    -> returns varchar(255) 
    -> begin 
    -> declare strLen int ; 
    -> declare lookupChar char(1); 
    -> declare finalString varchar(255); 
    -> declare x int; 
    -> 
    -> set strLen = length(myString); 
    -> set x = 1 ; 
    -> set finalString = ''; 
    -> while x <= strLen do 
    -> set lookupChar = substring(myString,x,1); 
    -> if finalString = '' then 
    ->  set finalString = lookupChar; 
    -> else 
    ->  set finalString = concat(finalString,',',lookupChar); 
    -> end if; 
    -> set x = x+1; 
    -> end while; 
    -> return finalString; 
    -> end// 
Query OK, 0 rows affected (0.00 sec) 

mysql> delimiter ; 

を作成することができますされます機能

mysql> select id,myFunction(value) as value from mytable ; 
+------+-----------------------+ 
| id | value     | 
+------+-----------------------+ 
| 1 | A,H,G,J,T,O,S,I,Y,G,J | 
| 2 | O,T,P,D,B,S,K,G,Y  | 
| 3 | H,F,R,Y,E,C   | 
| 4 | O,P,F,K,W,I,F,S  | 
+------+-----------------------+ 

テーブル全体でこれを行うことができますし、必要に応じて簡単に更新を行うこともできます。

1

は、我々は最大の長さの入力文字列に1からシーケンス番号の作業テーブルを必要とする:

create table seqnum(X int not null, primary key(X)); 
insert into seqnum values(1),(2),(3),(4); 
insert into seqnum select X+4 from seqnum; 
insert into seqnum select X+8 from seqnum; 
insert into seqnum select X+16 from seqnum; 
insert into seqnum select X+32 from seqnum; 

テストタブE:

create table test6(id int, lett varchar(100)); 
insert into test6 values(1,'AHGJTOSIYGJ'),(2,'OTPDBSKGY'),(3,'HFRYEC'),(4,'OPFKWIFS'); 

クエリは、テーブルTEST6に変更された文字を選択するには:

select id, lett, group_concat(substr(lett,S.X,1) ORDER BY T.id, S.x SEPARATOR ', ') 
    from test6 T, seqnum S 
where S.X<=length(T.lett) 
group by id 

結果:

update test6 A 
    join (
     select id, group_concat(substr(lett,S.X,1) ORDER BY T.id, S.x SEPARATOR ', ') new 
      from test6 T, seqnum S 
     where S.X>0 and S.X<=length(T.lett) 
     group by id 
     ) B ON A.id=B.id 
    set A.lett=B.new 

:既存のテーブルを使用するクエリの更新値について

1 | AHGJTOSIYGJ | A, H, G, J, T, O, S, I, Y, G, J 
2 | OTPDBSKGY | O, T, P, D, B, S, K, G, Y 
3 | HFRYEC  | H, F, R, Y, E, C 
4 | OPFKWIFS | O, P, F, K, W, I, F, S 

Test on sqlfiddle.com

+0

たぶん私の質問は間違っていたが、私は4行を持っていない。私は50kの行を持っていて、すべてランダムな文字を持っています。これは動作していますが、私はすべての行でこれを行う方法がわかりません。 – Tauras

+0

@タウラス私の答えは、任意の数の行で動作するはずです。 'seqnum'の数字は、入力テーブルの行の数ではなく、1つの文字列上の文字の位置です – Mike

関連する問題