繁体   English   中英

在WHERE子句中使用MySQL变量

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM