Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe uma maneira de dinamizar linhas para colunas no MySQL sem usar CASE?


O link que Kangkan forneceu mostrará como fazer isso se você conhecesse os nomes das colunas com antecedência. Estamos indo para a mesma lógica, exceto usando SQL dinâmico para construir a instrução. Há 2 partes para cada campo que você precisa incluir, o campo na instrução select e uma junção apropriada para obter o valor...

Primeiro declare 3 variáveis ​​para construir isso... Eu irei com @select, @join e @sql para este exemplo. Dê as variáveis ​​os valores iniciais
 set @select = 'select user_id,'
 set @join = 'from table t'

agora declare e carregue um cursor com os valores distintos no campo table.key. Vou usar @field enquanto a variável é preenchida com o campo distinto table.key. Em seguida, percorra-o construindo as duas variáveis:
 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

(a junção é projetada para usar o valor em @field como o alias da tabela)

faça um loop pelo seu cursor construindo @select e @join. No final do ciclo:
set @sql = @select + @join + 'where clause if you want'
exec @sql

SQL dinâmico construído como este pode ser uma dor absoluta para solucionar problemas (e acertar) e abrir problemas de segurança... mas é a única maneira de ver isso realizado. Observe as restrições de tamanho em suas variáveis... se você tiver muitas chaves distintas lá, as variáveis ​​crescerão muito. Desculpe, eu não posso ser mais exato com o pseudo sobre isso ... você encontrará a construção de sql dinâmico em sql é meticuloso.