2017-09-01 33 views
0

說我有以下數據:SQL:「轉」若干個位/二進制列成一個多元列

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系統表中找到列名
  • 使用通過列名
  • 循環通過遊標循環 ,創建準備/執行到 執行特定的查詢與屬性查找用戶和 打開屬性(列名)到「描述」字段
  • 商店 在名稱的臨時表的值/描述
  • 選擇重sults。

實施例:

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) 
相關問題