我有这个:
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;
如您所见,它非常复杂,并且, , , ,a
和b
是c
很d
长的字段名称[这些名称表达了它们的功能]。x
y
z
我现在在 MySQL 8.0.20 上收到此错误消息:
X 在表达式中设置用户变量已被弃用,并将在未来的版本中删除。考虑替代方案:“SET variable=expression, ...”或“SELECT expression(s) INTO variables(s)”。
好的,这是一个错误的地方来讨论它是否有意义@var := value
被弃用,所以我必须继续前进,我想确保如果安装了下一个 MySQL 更新程序不会停止工作。
我可以这样解决它:
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;
老实说,这不会造成伤害,而且我发现最糟糕的是,它变得如此难以理解,并且改变了我必须多次维护的任何调用--> 错误。
此外,在当前版本中,SELECT 的长度从 2'334 字节增加到 3'504 字节。
我正在尝试使用临时表,但填充表是一个相当长且 [无用] 复杂的 SELECT 使用LEFT JOIN
as@foo5
依赖@foo1-4
和@foo6
依赖于@foo5
。
这行得通,但我想知道是否可能有另一种我看不到的解决方案。建议SELECT expression(s) INTO variables(s)
我不明白这对我的情况有何帮助。
正如我在开头所写的那样,我不明白为什么不推荐使用此功能,因为它显然可以解决很多麻烦并使复杂的 SELECT 语句变得更简单......
有什么建议么?