Eu tenho isto:
SELECT
@foo1 := UDF1(0, a, b, c, d) AS Foo1,
@foo2 := UDF1(1, a, b, c, d) AS Foo2,
@foo3 := UDF1(2, a, b, c, d) AS Foo3,
@foo4 := UDF1(3, a, b, c, d) AS Foo4,
@foo5 := UDF2( @foo1, @foo2, @foo3, @foo4) AS Foo5,
@foo6 := UDF3( @foo1, @foo2, @foo3, @foo4) AS Foo6,
@foo8 := UDF4( @foo5, @foo7, x, y, z) AS Foo8
FROM MyTable;
Como você pode ver, é bastante complicado e a
, b
, c
, d
, x
, y
e z
são nomes de campos bastante longos [Os nomes expressam sua funcionalidade ].
Recebo agora esta mensagem de erro no MySQL 8.0.20:
X A configuração de variáveis de usuário em expressões está obsoleta e será removida em uma versão futura. Considere alternativas: 'SET variável=expressão, ...', ou 'SELECT expressão(ões) INTO variável(is)'.
OK, este é o lugar errado para discutir se faz sentido que @var := value
seja obsoleto, então eu tenho que seguir em frente e quero garantir que o programa não pare de funcionar se a próxima atualização do MySQL for instalada.
Eu poderia resolver assim:
SELECT
UDF1(0, a, b, c, d) AS Foo1,
UDF1(1, a, b, c, d) AS Foo2,
UDF1(2, a, b, c, d) AS Foo3,
UDF1(3, a, b, c, d) AS Foo4,
UDF2(UDF1(0, a, b, c, d), UDF1(1, a, b, c, d), UDF1(2, a, b, c, d), UDF1(3, a, b, c, d)) AS Foo5,
UDF3(UDF1(0, a, b, c, d), UDF1(1, a, b, c, d), UDF1(2, a, b, c, d), UDF1(3, a, b, c, d) ) AS Foo5,
UDF3(UDF2(UDF1(0, a, b, c, d) , UDF1(1, a, b, c, d) , UDF1(2, a, b, c, d) , UDF1(3, a, b, c, d) ) ,
UDF3(UDF1(0, a, b, c, d), UDF1(1, a, b, c, d), UDF1(2, a, b, c, d), UDF1(3, a, b, c, d) ), x, y, z) AS Foo6
FROM MyTable;
Honestamente, isso não dói e, o que eu acho pior, fica tão ilegível e alterando qualquer chamada que tenho que manter muitas vezes --> buggy.
Além disso, na versão atual, o comprimento do SELECT cresce de 2.334 bytes para 3.504 bytes.
Estou tentando trabalhar com uma tabela temporária, mas para preencher a tabela é um SELECT bastante longo e [inútil] complicado usando LEFT JOIN
como @foo5
depende @foo1-4
e @foo6
depende de @foo5
.
Isso funciona, mas estou querendo saber se pode haver outra solução que não sou capaz de ver. O sugerido SELECT expression(s) INTO variables(s)
eu não entendo como isso deve ajudar no meu caso.
Como escrevi no início, não entendo por que esse recurso está obsoleto, pois aparentemente pode resolver muitos problemas e simplificar as instruções SELECT complicadas ...
Alguma sugestão?
Posso dar um exemplo mais concreto do que foi realmente obsoleto.
Sete anos atrás, escrevi a resposta para Obter a classificação de um usuário em uma tabela de pontuação
Eu utilizo variáveis para descobrir o rank de uma tabela de pontuação e atribuir o mesmo valor para rank caso mais de um usuário tenha a mesma pontuação (ou seja, caso haja empate):
Esta instrução SQL é uma expressão e não funcionará no MySQL 8.0.
Tente imaginar tentar reescrever isso sem variáveis. Eu sinto sua dor !!!
Consultas agressivas que usam variáveis dessa maneira são o que está sendo preterido.
SUGESTÃO
Assumindo que
a
,b
,c
,d
,x
,y
,z
são colunas deMyTable
Você simplesmente reescreve como
DE UMA CHANCE !!!