Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es eine Möglichkeit, in MySQL Zeilen in Spalten zu verschieben, ohne CASE zu verwenden?

Der von Kangkan bereitgestellte Link zeigt Ihnen, wie Sie dies durchführen können, wenn Sie die Spaltennamen im Voraus gekannt haben. Wir verwenden dieselbe Logik, außer dass wir dynamisches SQL verwenden, um die Anweisung zu erstellen. Es gibt 2 Teile für jedes Feld, das Sie einschließen müssen, das Feld in der Select-Anweisung und einen geeigneten Join, um den Wert zu erhalten ... also müssen wir die Anweisung in zwei Teilen aufbauen

Deklarieren Sie zuerst 3 Variablen, um dies zu erstellen ... Ich werde für dieses Beispiel @select, @join und @sql verwenden. Geben Sie den Variablen die Anfangswerte

 set @select = 'select user_id,'
 set @join = 'from table t'

Deklarieren und laden Sie nun einen Cursor mit den unterschiedlichen Werten im Feld table.key. Ich werde @field verwenden, da die Variable mit dem eindeutigen Feld table.key gefüllt wird. Schleife es dann durch und baue die beiden Variablen:

 set @select = @select + ', ' + @field + '.value as '[email protected]+'
 set @join = @join + ' left join table ' + @field + 'on '[email protected]+'.key = t.key and and '[email protected]+'.user_id = t.user_id

(Der Join ist so konzipiert, dass er den Wert in @field als Alias ​​der Tabelle verwendet)

Durchlaufen Sie Ihren Cursor und bauen Sie @select und @join auf. Am Ende der Schleife:

set @sql = @select + @join + 'where clause if you want'
exec @sql

Dynamisches SQL, das so aufgebaut ist, kann ein absoluter Schmerz sein, um Fehler zu beheben (und richtig zu machen) und Sicherheitsprobleme zu eröffnen ... aber es ist ungefähr der einzige Weg, wie ich dies erreichen kann. Achten Sie auf Größenbeschränkungen für Ihre Variablen .... wenn Sie dort zu viele verschiedene Schlüssel haben, werden die Variablen zu groß. Tut mir leid, dass ich das mit dem Pseudo nicht genauer sagen kann ... Sie werden feststellen, dass das Erstellen von dynamischem SQL in SQL mühsam ist.