sql >> Database >  >> RDS >> Mysql

Is er een manier om rijen naar kolommen in MySQL te draaien zonder CASE te gebruiken?

De link die Kangkan heeft verstrekt, laat zien hoe u dit kunt doen als u de kolomnamen van tevoren had geweten. We gaan voor dezelfde logica, behalve het gebruik van dynamische SQL om de verklaring te bouwen. Er zijn 2 delen van elk veld dat u moet opnemen, het veld in de select-instructie en een geschikte join om de waarde te krijgen ... dus we moeten de instructie in twee delen bouwen

Declareer eerst 3 variabelen om dit te bouwen... Ik ga voor dit voorbeeld met @select, @join en @sql. Geef de variabelen de beginwaarden

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

declareer en laad nu een cursor met de afzonderlijke waarden in het veld table.key. Ik ga @field gebruiken omdat de variabele wordt gevuld met het veld distinct table.key. Loop er dan doorheen en bouw de twee variabelen:

 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

(de join is ontworpen om de waarde in @field te gebruiken als de alias van de tabel)

loop door je cursor en bouw @select en @join uit. Aan het einde van de lus:

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

Dynamische SQL die op deze manier is gebouwd, kan absoluut lastig zijn om problemen op te lossen (en goed te krijgen) en beveiligingsproblemen op te lossen ... maar het is ongeveer de enige manier waarop ik dit kan zien bereikt. Let op de groottebeperkingen van uw variabelen... als u daar te veel verschillende Key's heeft, worden de variabelen te groot. Sorry, ik kan niet nauwkeuriger zijn met de pseudo-informatie hierover... je zult merken dat het bouwen van dynamische sql in sql nauwgezet is.




  1. Hoe INNER JOIN te gebruiken in SQL

  2. Zijn geneste transacties toegestaan ​​in MySQL?

  3. Hoe records selecteren met duplicaat van slechts één veld en alle andere veldwaarden?

  4. SQLite Database geeft waarschuwing automatische index op <table_name>(kolom) Na het upgraden van Android L