sql >> Database teknologi >  >> RDS >> Mysql

Er der en måde at pivotere rækker til kolonner i MySQL uden at bruge CASE?

Linket, som Kangkan gav, viser dig, hvordan du kan gøre dette, hvis du havde kendt kolonnenavnene på forhånd. Vi går efter den samme logik, bortset fra at bruge dynamisk SQL til at bygge sætningen. Der er 2 dele til hvert felt, som du skal inkludere, feltet i select-sætningen og en passende join for at få værdien...så vi bliver nødt til at bygge sætningen i to dele

Først erklærer 3 variabler for at bygge dette...Jeg vil gå med @select, @join og @sql for dette eksempel. Giv variablerne startværdierne

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

erklær og indlæs nu en markør med de forskellige værdier i feltet table.key. Jeg vil bruge @field, da variablen bliver udfyldt med det distinkte table.key-felt. Gå derefter igennem det og bygger de to variable:

 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

(sammenføjningen er designet til at bruge værdien i @field som tabellens alias)

gå gennem din markør ved at bygge @select og @join ud. I slutningen af ​​løkken:

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

Dynamisk SQL bygget som dette kan være en absolut smerte at fejlfinde (og rette op på) og åbne op for sikkerhedsproblemer...men det er omtrent den eneste måde, jeg kan se dette opnået. Hold øje med størrelsesbegrænsninger på dine variabler....hvis du har for mange forskellige nøgler der, vokser variablerne for store. Beklager, jeg kan ikke være mere præcis med pseudo'en på dette...du vil opdage, at det er omhyggeligt at bygge dynamisk sql i sql.




  1. Forbedre SQL INSERT-forespørgsel for at undgå sql-injektioner

  2. Sådan formulerer du din værdi som DBA til finansdirektører

  3. MySQL - Er det muligt at bruge LIKE på alle kolonner i en tabel?

  4. Sådan flyttes en model mellem to Django-apps (Django 1.7)