人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: まさきん
●カテゴリ:インターネット ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● きゃづみぃ
●250ポイント

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 テーブル名

こんな 感じで使います。


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

2 ● うぃんど
●250ポイント ベストアンサー

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;

まさきんさんのコメント
ありがとうございます。内容確認しました。 なるほど、ケース文と組み合わせるとうまくエラーハンドリングできますね。 こちらの回答を併せてクローズします。ありがとうございました。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ