2017-01-04 14 views
0

MySQLデータベーステーブルの1つに、テキスト形式の値を含むカラムがあります。列名は 'test_column'、表名は 'test_table'となります。フィールド/セルの値の1つは以下の通りです。MySQLクエリ - テキストタイプフィールドの特定の文字の前にある数字の抽出

--- 
abc: 1 
pqr: 1 
uvw: 0 
opq: 5 
srt: 6 
xyz: 1 
qrs: 1 
ijk: 1 
tuv: 1 
ghi: 1 
--- 

だから、私はすべてのこれらの数字を取ると、すべてのsumを取得したいです。値に固有の書式があり、数字の前にコロンとスペース(': ')が付きます。では、の番号を取得して、の合計をクエリで取得するにはどうすればよいですか。どんな助けもありがとう。

+2

別々の列にすべての値を格納する方がよいまたは行... –

+0

それを変更することは良いアイデアのようですが、少なくとも私たちは余裕がない限り、私たちのシステムに影響を与えます。また、データをハッシュ形式でテキストフィールドに保存します。ですから、私はMySQLでどのように詳細を抽出できるのかを見たいと思います。とにかくあなたの提案に感謝します... –

答えて

2

更新

ラジェッシュは、問題のキーと値のペアが異なる行で、実際にはない明らかにしたが、彼らは(ペア間おそらく改行文字付き(\n))、全て同じ行にあります。この明確化を考えると、私の元の 答えは彼にとって役に立たなかった。ここで私は更新された答えを与えています。私はMySQLの外で複数のキーと値のペアの文字列を処理し、それを処理するために高水準のプログラム言語を使用する方が簡単だと思います。以下は、Javaを使用した の例です。

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class SplitAndSumKvPairs { 

    public static void main(String[] args) { 
     String input = "" 
       + "abc: 1\n" 
       + "pqr: 1\n" 
       + "uvw: 0\n" 
       + "opq: 5\n" 
       + "srt: 6\n" 
       + "xyz: 1\n" 
       + "qrs: 1\n" 
       + "ijk: 1\n" 
       + "tuv: 1\n" 
       + "ghi: 1"; 

     Pattern p = Pattern.compile("\\s*(?<key>\\w+):\\s*(?<value>\\d+)"); 
     Matcher m = p.matcher(input); 
     int sum = 0; 
     while (m.find()) { 
      int value = Integer.parseInt(m.group("value")); 
      sum += value; 
     } 

     System.out.format("Given this input %s%n%nthe sum is %d", input, sum); 
    } 

} 

このプログラムの出力は以下のとおりであった:

Given this input abc: 1 
pqr: 1 
uvw: 0 
opq: 5 
srt: 6 
xyz: 1 
qrs: 1 
ijk: 1 
tuv: 1 
ghi: 1 

the sum is 18 

あるいは、一方が上記と同様のロジックを表現するために格納された関数またはストアドプロシージャを使用しようとすることができます。キーと値のペアが異なる行

select  
    sum(substring_index(test_column, ': ', -1)) 
from 
    test_table 

のコードがSqlFiddleで試験されているされていると仮定

オールド回答(click on this link to see it

create table test_table (
    id    int not null primary key auto_increment 
    , test_column varchar(20) not null 
) engine=innoDB; 

insert into test_table 
values 
(null, 'abc: 1') 
, (null, 'pqr: 1') 
, (null, 'uvw: 0') 
, (null, 'opq: 5') 
, (null, 'srt: 6') 
, (null, 'xyz: 1') 
, (null, 'qrs: 1') 
, (null, 'ijk: 1') 
, (null, 'tuv: 1') 
, (null, 'ghi: 1'); 

答えが

18 
ました
+0

ありがとうございます。私にチェックさせてください... –

+0

これも動作しません.... –

+0

エラーメッセージは何ですか?私はSqlFiddle.comで自分のコードを試しました。私は結果を示すために上記の私の答えを更新しました。 – leeyuiwah

関連する問題