簡體   English   中英

SQL:將許多位/二進制列“轉置”為一個多元列

[英]SQL: 'transpose' a number of bit/binary columns into one multivariate column

說我有以下數據:

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

即,我想將各種二進制字段中保存的信息放入一種形式,其中每個“二進制正數”都顯示在其自己的行中。

如果有成百上千的二進制列,有沒有辦法使它具有可伸縮性?

這是應該擴展的例程。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM