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@fooWHERE機能します。しかし、リテラルを列に置き換えると、機能しなくなります。

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は1の後に評価されるため、SELECT一方、WHERE節はその前と直後に評価され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

なぜこれをやりたいのかわかりませんが、これでうまくいきます。

SELECT (@foo := 17 + 4) AS foo, @foo:=@foo * 2 AS バー; FROM テーブル 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 に答える