如何在 WHERE 子句中正确使用 MySQL 变量?我有大量查询,而不是 column1、column2、column3,这就是为什么我认为最好使用变量。不知道我做错了什么!
SELECT
@TEST:= CASE
WHEN column1=1 THEN 'ONE'
WHEN column1=2 THEN 'TWO'
WHEN column1=2 THEN 'THREE'
ELSE 'Unknown'
END AS test
FROM
table1
WHERE
@TEST= 'ONE'
如果我猜对了,你想避免重复自己:
SELECT CASE
WHEN column1=1 THEN 'ONE'
WHEN column1=2 THEN 'TWO'
WHEN column1=2 THEN 'THREE'
ELSE 'Unknown'
END AS test
FROM table1
WHERE CASE
WHEN column1=1 THEN 'ONE'
WHEN column1=2 THEN 'TWO'
WHEN column1=2 THEN 'THREE'
ELSE 'Unknown'
END = 'ONE';
...但明显的方法会引发错误:
SELECT CASE
WHEN column1=1 THEN 'ONE'
WHEN column1=2 THEN 'TWO'
WHEN column1=2 THEN 'THREE'
ELSE 'Unknown'
END AS test
FROM table1
WHERE test = 'ONE';
错误 1054 (42S22):“where 子句”中的未知列“test”
... 所以你已经发现你可以像在任何其他编程语言中一样使用变量。
无论好坏,SQL 都不是一种编程语言(它是一种查询语言)并且变量不会以这种方式运行。一般来说,您不能使用变量来替换代码片段。使用它们来存储值(如您的示例中所示)是非常危险的,正如手册所警告的那样:
除了在
SET
语句中,您永远不应该为用户变量赋值并在同一语句中读取该值。[...] 对于其他语句,例如SELECT
,您可能会得到预期的结果,但这并不能保证。
在这种情况下,重复整个表达式可能是唯一明智的方法。如果实际代码庞大且难以维护,您始终可以使用您的客户端语言(PHP、Java 等等)动态生成 SQL。MySQL 本身有一些动态 SQL 特性,但它们并不那么方便。
在特定情况下,您也可以使用子查询,但请注意性能有时可能会受到影响:
SELECT *
FROM (
SELECT CASE
WHEN column1=1 THEN 'ONE'
WHEN column1=2 THEN 'TWO'
WHEN column1=2 THEN 'THREE'
ELSE 'Unknown'
END AS test
FROM table1
) t
WHERE test = 'ONE';
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句