MySQLに関しての質問です。

あるテーブルの解析をしているのですが、
a=XXXXX&b=YYYYY&z=ZZZZ
というような情報が一つのカラムに入っている時に

a,b,cというカラムを作って
それぞれに
XXXXX,YYYYY,ZZZZ
の値を入れた表をSELECT文で取り出す方法を教えて下さい。

テーブルの作成権限はない前提でお願いします。
正規表現などで抽出できるのであればうれしいのですが。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2012/06/05 22:08:11
  • 終了:2012/06/06 21:50:31

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/06/06 19:19:40

ポイント250pt

MySQLの正規表現は「条件にマッチするかどうかの判定だけ」なので出番は無し
http://dev.mysql.com/doc/refman/5.1/ja/regexp.html

基本形的な単純例

CREATE TEMPORARY TABLE t (カラム TEXT);
INSERT INTO t VALUES('a=XXXXX&b=YYYYY&z=ZZZZ');

SELECT 
    SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'a=', -1 ), '&', 1 ) AS a,
    SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'b=', -1 ), '&', 1 ) AS b,
    SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'z=', -1 ), '&', 1 ) AS z
FROM t;

 
歯抜けのあるデータを対象とする場合の改造例

CREATE TEMPORARY TABLE t (カラム TEXT);

INSERT INTO t VALUES
('a=XXXXX&b=YYYYY&z=ZZZZ'),
('a=XXXXX&z=ZZZZ'),
('b=YYYYY&z=ZZZZ')
;

SELECT 
    CASE WHEN INSTR(カラム,'a=') THEN SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'a=', -1 ), '&', 1 ) ELSE '' END AS a,
    CASE WHEN INSTR(カラム,'b=') THEN SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'b=', -1 ), '&', 1 ) ELSE '' END AS b,
    CASE WHEN INSTR(カラム,'z=') THEN SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'z=', -1 ), '&', 1 ) ELSE '' END AS z
FROM t;
id:masakiplus

ありがとうございます。内容確認しました。
なるほど、ケース文と組み合わせるとうまくエラーハンドリングできますね。

こちらの回答を併せてクローズします。ありがとうございました。

2012/06/06 21:49:56

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13539ベストアンサー獲得回数11982012/06/05 22:46:52

ポイント250pt

a=XXXXX&b=YYYYY&z=ZZZZ
の入った項目をカラムとします。

a
mid(カラム,3,instr(カラム,'&b=')-3)

b
mid(カラム,instr(カラム,'&b='),instr(カラム,'&z=')-instr(カラム,'&b=')-3)

c
right(カラム,LENGTH(カラム)-instr(カラム,'&z=')-3)


それぞれ このようにして 抽出すればいいでしょう。

select mid(カラム,3,instr(カラム,'&b=')-3) a,mid(カラム,instr(カラム,'&b='),instr(カラム,'&z=')-instr(カラム,'&b=')-3) b,right(カラム,LENGTH(カラム)-instr(カラム,'&z=')-3) c from テーブル名

こんな 感じで使います。

id:masakiplus

ありがとうございます。
実際にデータも取得できました。
正規表現や関数を使った回答が出てこなければこちらをベストアンサーとさせてください。
今しばらく回答を募集します。

どうぞよろしくお願いします。
ありがとうございます!

2012/06/06 10:57:24
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492012/06/06 19:19:40ここでベストアンサー

ポイント250pt

MySQLの正規表現は「条件にマッチするかどうかの判定だけ」なので出番は無し
http://dev.mysql.com/doc/refman/5.1/ja/regexp.html

基本形的な単純例

CREATE TEMPORARY TABLE t (カラム TEXT);
INSERT INTO t VALUES('a=XXXXX&b=YYYYY&z=ZZZZ');

SELECT 
    SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'a=', -1 ), '&', 1 ) AS a,
    SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'b=', -1 ), '&', 1 ) AS b,
    SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'z=', -1 ), '&', 1 ) AS z
FROM t;

 
歯抜けのあるデータを対象とする場合の改造例

CREATE TEMPORARY TABLE t (カラム TEXT);

INSERT INTO t VALUES
('a=XXXXX&b=YYYYY&z=ZZZZ'),
('a=XXXXX&z=ZZZZ'),
('b=YYYYY&z=ZZZZ')
;

SELECT 
    CASE WHEN INSTR(カラム,'a=') THEN SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'a=', -1 ), '&', 1 ) ELSE '' END AS a,
    CASE WHEN INSTR(カラム,'b=') THEN SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'b=', -1 ), '&', 1 ) ELSE '' END AS b,
    CASE WHEN INSTR(カラム,'z=') THEN SUBSTRING_INDEX( SUBSTRING_INDEX( カラム, 'z=', -1 ), '&', 1 ) ELSE '' END AS z
FROM t;
id:masakiplus

ありがとうございます。内容確認しました。
なるほど、ケース文と組み合わせるとうまくエラーハンドリングできますね。

こちらの回答を併せてクローズします。ありがとうございました。

2012/06/06 21:49:56

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません