1

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

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;

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

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

4 回答 4

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的;whileWHERE子句在它之前和之后被评估FROM

于 2013-09-11T13:11:26.837 回答
2

分选!

SELECT foo
     , foo * 2 As bar
FROM   (
        SELECT (17 + 4) AS foo
       ) As hey_look_at_me
WHERE  foo = 42
于 2013-09-11T11:59:21.800 回答
0

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

选择 (@foo := 17 + 4) 作为 foo,@foo:=@foo * 2 作为酒吧;从表 WHERE @foo = 42;

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

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

于 2013-09-11T11:56:09.093 回答
-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
于 2013-09-11T12:04:16.540 回答