SQL:'转置'将多个位/二进制列放入一个多变量列

时间:2017-09-01 16:01:32

标签: sql binary multiple-columns bit

说我有以下数据:

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

即,我希望将这些各种二进制字段中保存的信息放入一个表格中,其中每个二进制正字符都是'在它自己的行中显示。

如果有数百个二进制列,是否有办法使这种可扩展性?

1 个答案:

答案 0 :(得分:0)

这是一个应该扩展的例程。

  • 使用INFORMATION_SCHEMA系统表查找列名称
  • 使用光标循环 通过列名
  • 循环,创建准备/执行 执行特定查询,查找具有该属性AND的用户 将属性(列名称)转换为“描述”字段
  • 商店 名称/描述的临时表中的那些值
  • 选择结果。

示例:

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)