2017-09-01 2 views
0

sagen, dass ich die folgenden Daten haben:SQL: ‚transponieren‘ eine Reihe von Bit/binary Spalten in einer multivariaten Spalte

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

Aber ich möchte die folgenden Daten erhalten:

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

dh Ich möchte die Informationen, die in diesen verschiedenen binären Feldern enthalten sind, in eine Form bringen, in der jedes "binäre Positive" in einer eigenen Zeile angezeigt wird.

Gibt es eine Möglichkeit, dies skalierbar zu machen, wenn es Hunderte von binären Spalten gibt?

Antwort

0

Hier ist eine Routine, die skalieren sollte.

  • Verwenden INFORMATION_SCHEMA Systemtabelle mit diesem Attribut die Spaltennamen
  • Verwenden Sie einen Cursor auf Schleife durch die Spaltennamen
  • durch Looping, erstellen Vorbereiten/Ausführen zu ausführen, um eine spezifische Abfrage zu finden, um die Benutzer zu finden UND Drehen des Attributs (Spaltenname) in ein Feld „Beschreibung“
  • Shop diese Werte in eine temporäre Tabelle für Name/Beschreibung
  • die Wieder auswählen Sult.

Beispiel:

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 ; 

Und die Ergebnisse:

mysql> call myproc(); 
+------+----------------+ 
| name | description | 
+------+----------------+ 
| Tom | ismarried  | 
| Tom | hasdog   | 
| Tom | wants_children | 
| Dick | hasdog   | 
| Dick | wants_children | 
+------+----------------+ 
5 rows in set (0.00 sec) 
Verwandte Themen