Tenho uma tabela assim:
|Name1 |Name2 | Name3 | Name4|
|------+------+-------+------|
|Zoe |NULL |NULL |NULL |
|Julia |NULL |NULL |NULL |
|NULL |Ashley|NULL |NULL |
|NULL |Belvet|NULL |NULL |
|NULL |Maria |NULL |NULL |
|NULL |NULL |Mark |NULL |
|NULL |NULL |Jane |NULL |
|NULL |NULL |NULL |Eve |
|NULL |NULL |NULL |Jenny |
|NULL |NULL |NULL |Ketty |
Como posso ordenar em ordem alfabética cada coluna de forma que os valores NULL sejam colocados na parte inferior, assim:
|Name1 |Name2 | Name3 | Name4|
|------+------+-------+------|
|Julia |Ashley|Jane |Eve |
|Zoe |Belvet|Mark |Jenny |
|NULL |Maria |NULL |Ketty |
?
O que você parece querer é algo bastante incomum (pelo menos na minha perspectiva), onde o conceito de linha não é mais importante, e você se preocupa apenas com colunas , ignorando de qual linha seus valores vieram. Isso é um pouco complicado, porque o SQL entende colunas junto com linhas. Então você precisa, de alguma forma, desconstruir suas tabelas e reconstruí -las mais tarde.
A primeira coisa que faremos é ter um diferente
table
(resultado de uma subconsulta) com duas colunas: arow_number()
e oneNameX
:Para cada coluna, faremos algo como:
... e isso resultaria em:
Esta é uma desconstrução (para colocar um nome).
NOTA :
@rownum := @rownum + 1
é equivalente a usarROW_NUMBER()
no SQL padrão. Veja ROW_NUMBER() no MySQL . MySQL não tem umarow_number()
função, mas permite que você use variáveis em suas consultas (Veja MySQL 5.7 Reference Manual / Language Structure / User-Defined Variables / 9.4 User-Defined Variables )Com isso em mente, devemos então fazer:
rank
) e com o mesmo número de linhas da tabela original. NósJOIN
os reunimos nesta coluna comum.NULL
de ponta a ponta adicionando umWHERE NOT (Name1 IS NULL AND Name2 IS NULL AND Name3 IS NULL AND Name4 IS NULL)
A consulta completa será então:
E isso lhe dará o resultado pretendido:
Você pode verificar tudo junto no dbfiddle aqui
Se você estiver usando o MariaDB 10.2 ou outro banco de dados que conheça
WINDOW
funções, você pode simplificar esta consulta para:e você obterá o mesmo resultado.
dbfiddle aqui
Você pode até tirar vantagem do fato de que o MariaDB classifica
NULLS LAST
e ignorar oCOALESCE
:dbfiddle aqui
NOTA: Os planos de execução são idênticos, portanto, espera-se que as duas últimas consultas demorem aproximadamente o mesmo tempo para serem executadas.