web-dev-qa-db-ja.com

MySQLのフィールドまたは列にエイリアスを設定する方法は?

私はこのようなことをしようとしています。しかし、不明な列エラーが発生します。

SELECT SUM(field1 + field2) AS col1, col1 + field3 AS col3 from core

基本的には、エイリアスを使用して、以前に実行した操作を実行する必要がないようにします。これはmysqlで可能ですか?

30
user225269

次のようなサブクエリの使用を検討してください。

SELECT col1
,      col1 + field3 AS col3 
FROM   (
       SELECT  field1 + field2 as col1
       ,       field3
       from    core
       ) as SubQueryAlias
20
Andomar

select @code:= SUM(field1 + field2), @code+1 from abc;

ただし、次の点に注意してください( MySQL 5.6 docs から):

一般的な規則として、SETステートメント以外では、ユーザー変数に値を割り当てて、同じステートメント内で値を読み取ることはできません。たとえば、変数をインクリメントするには、これで問題ありません。

SET @a = @a + 1;

SELECTなどの他のステートメントでは、期待どおりの結果が得られる場合がありますが、これは保証されていません。次のステートメントでは、MySQLが最初に@aを評価し、次に割り当てを行うと考えるかもしれません。

SELECT @a, @a:=@a+1, ...;

ただし、ユーザー変数を含む式の評価順序は定義されていません。

したがって、自己責任で使用してください。

35
Ravi Parekh

エイリアスをselectできます:

SELECT SUM(field1 + field2) AS col1, (select col1) + field3 AS col3 from core

これは機能します。

13
Moises

仕様 によると、「ユーザー変数を含む式の評価順序は定義されていない」ため、Ravi Parekhの回答が常に機能するとは限りません。

変数を使用しようとして奇妙な結果を得た後、私は this answer を見つけました。

4
mmavcy
select @code:= SUM(field1 + field2), (@code*1) from abc;

@ code * 1を数値式に変換し、次のような場所で使用できます

select @code:= SUM(field1 + field2), (@code*1)+field3 from abc;
3
Kamran Aslam

短い答えはノーです:

mysql> select 1 as a, a + 1 as b;
ERROR 1054 (42S22): Unknown column 'a' in 'field list'

postgresql# select 1 as a, a + 1 as b;
ERROR:  column "a" does not exist

つまり、SQL実装によっては、where/group by/having句でエイリアスを使用できるようになっています。

postgresql# select 1 as a group by a; -- 1 row
2

集計関数(グループ化)で使用していて、機能しない場合は、計算列を前方列参照で最後に配置します。

SELECT FNC2(AF), FNC1(A) AS AF,  B, C,  FROM Table GROUP BY ...

1st one doesn't work due to forward column referencing. Do this instead 

SELECT FNC1(A) AS AF, B, C, FNC2((SELECT AF)) FROM Table GROUP BY ...