[英]Using MySQL variable in WHERE clause
如何在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';
我觉得WHERE
是之前
评估
应用SELECT
,这意味着您的查询是不可能在所有的方式(不是100%肯定寿)。
您可以通过这种方式进行操作,基本上是相同的:
SELECT
column1 AS TEST
FROM
table1
WHERE
(column1 = 1 AND ONE = 'ONE')
OR (column1 = 2 AND TWO = 'ONE')
OR (column1 = 3 AND THREE = 'ONE')
OR Unknown = 'ONE'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.