在WHERE子句中访问SELECT的计算值

时间:2013-09-11 11:52:39

标签: mysql sql

我正在尝试执行这样的查询:

SELECT
  (17 + 4) AS foo,
  foo * 2 AS bar;

失败,返回Unknown column 'foo' in 'field list'。所以我这样做了:

SELECT
  (@foo := 17 + 4) AS foo,
  @foo * 2 AS bar;

哪个有效。现在的问题是我想在foo子句中集成这个计算值(WHERE):

SELECT
  (@foo := 17 + 4) AS foo,
  @foo * 2 AS bar
FROM lorem
WHERE foo = 21;

失败:Unknown column 'foo' in 'where clause'

如果我将foo替换为@foo中的WHERE,则可行。但是,如果我用列替换文字,它就会停止工作:

SELECT
  (@foo := ipsum) AS foo,
  @foo * 2 AS bar
FROM lorem
WHERE @foo = 33;

在表lorem中返回包含此内容的空集:

SELECT * FROM lorem;
+-------+
| ipsum |
+-------+
|    33 |
+-------+

4 个答案:

答案 0 :(得分:3)

我找到了解决方案,它使用HAVING子句代替WHERE,如下所示:

SELECT
  (@foo := ipsum * 2) AS foo,
  @foo * 2 AS bar
FROM lorem
HAVING foo = 66;

返回:

+------+------+
| foo  | bar  |
+------+------+
|   66 |  132 |
+------+------+

使用:

SELECT * FROM lorem;
+-------+
| ipsum |
+-------+
|    33 |
|    41 |
+-------+

因为在HAVING之后SELECT 评估了;虽然WHERE子句在<{1}}之前评估,但在FROM之后。

答案 1 :(得分:2)

子选择!

SELECT foo
     , foo * 2 As bar
FROM   (
        SELECT (17 + 4) AS foo
       ) As hey_look_at_me
WHERE  foo = 42

答案 2 :(得分:0)

我不知道你为什么要这样做,但这样做会。

选择      (@foo:= 17 + 4)AS foo,       @foo:= @ foo * 2 AS吧;    从表    在哪里@foo = 42;

foo不是一个列,它是一个计算值,所以你不能在where子句中使用它。并且@foo在您的查询中的值为21,如果您说@foo = 42则会失败,因此它不会给出任何结果。

因此,如果您希望验证最终值,请将其分配给变量并验证它。

答案 3 :(得分:-2)

在Oracle SQL中,我能够做到这一点。 表table_temp

中的值
select * from table_temp;
foo bar
11  54
17  42


SELECT
  17+4 AS foo,
   foo * 2 AS bar
  from table_temp
  where bar =42;

foo bar
21  42