【问题标题】:SQL: 'transpose' a number of bit/binary columns into one multivariate columnSQL:将许多位/二进制列“转置”为一个多元列
【发布时间】:2018-02-10 17:53:05
【问题描述】:

假设我有以下数据:

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

也就是说,我想将这些不同二进制字段中保存的信息放入一个表单中,其中每个“二进制正数”都显示在自己的行中。

如果有数百个二进制列,有没有办法使这个可扩展?

【问题讨论】:

    标签: sql binary multiple-columns bit


    【解决方案1】:

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

    • 使用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)
    

    【讨论】:

      猜你喜欢
      • 2021-10-13
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 2015-05-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多