2017-09-01 7 views
0

に「転置」ビット/バイナリ列の数は、私は次のようなデータを持っていると言う:SQL:1つの多変量列

name is_married has_dog wants_children 
Tom   1  1    1 
Dick   0  1    1 
Harry   0  0    0 

しかし、私は次のようなデータを得たい:

name description 
Tom is_married 
Tom has_dog 
Tom wants_children 
Dick has_dog 
Dick wants_children 

すなわち私はこれらのさまざまなバイナリフィールドに保持されている情報を、それぞれの「バイナリポジティブ」がそれ自身の行に表示される形式に配置したいと考えています。

何百ものバイナリ列がある場合、これをスケーラブルにする方法はありますか?

答えて

0

ここではスケールする必要のあるルーチンがあります。

  • 使用INFORMATION_SCHEMAシステムテーブルの列名
  • は、その属性を持つユーザーを見つけ、特定のクエリを実行 に準備/実行の作成、をループ列名
  • をループ にカーソルを使用見つけるためにそして、 ストア
  • 「説明」フィールドに属性(列名)を回し名前/説明
  • の一時テーブル内のこれらの値は、再選択します悲しみ

例:

DELIMITER $$ 
CREATE PROCEDURE myproc() 
BEGIN 
    DECLARE sql_stmt varchar(200); 
    DECLARE exit_loop INTEGER DEFAULT 0; 

    DECLARE col_names CURSOR FOR SELECT CONCAT('select name, "', column_name, '" As Description from tbl where ' , column_name, '=1') 
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE table_name = 'tbl' 
    and column_name <> 'Name' 
    ORDER BY ordinal_position; 

    DECLARE CONTINUE HANDLER FOR NOT FOUND SET exit_loop = TRUE; 

CREATE TEMPORARY TABLE temp (name varchar(200), description varchar(200)); 

OPEN col_names; 

the_loop: LOOP 

    FETCH col_names 
    INTO sql_stmt; 

    IF exit_loop THEN 
     CLOSE col_names; 
     LEAVE the_loop; 
    END IF; 

SET @s = CONCAT('INSERT INTO temp(name, description) ',sql_stmt); 


PREPARE stmt1 FROM @s; 
EXECUTE stmt1; 

END LOOP the_loop; 

SELECT * from temp ORDER BY name; 

DROP TABLE temp; 

END$$ 
DELIMITER ; 

と結果:

mysql> call myproc(); 
+------+----------------+ 
| name | description | 
+------+----------------+ 
| Tom | ismarried  | 
| Tom | hasdog   | 
| Tom | wants_children | 
| Dick | hasdog   | 
| Dick | wants_children | 
+------+----------------+ 
5 rows in set (0.00 sec) 
関連する問題