これは、SQL dbms があいまいな名前を解決する方法に関係しています。
SQL 標準でのこの動作はまだ追跡していませんが、プラットフォーム間で一貫しているようです。何が起こっているかは次のとおりです。
create table test (
col_1 integer,
col_2 integer
);
insert into test (col_1, col_2) values
(1, 3),
(2, 2),
(3, 1);
「col_1」を「col_2」にエイリアスし、そのエイリアスを ORDER BY 句で使用します。 dbms は ORDER BY の "col_2" を "col_1" のエイリアスとして解決し、"test"."col_1" の値で並べ替えます。
select col_1 as col_2
from test
order by col_2;
col_2 -- 1 2 3
ここでも、"col_1" を "col_2" にエイリアスしますが、ORDER BY 句で式を使用します。 dbms は「col_2」を解決 しない 「col_1」のエイリアスとして、ただし列「test」.「col_2」として。 "test"."col_2".
の値で並べ替えます。select col_1 as col_2
from test
order by (col_2 || '');
col_2 -- 3 2 1
したがって、あなたの場合、dbms は式の "NewValue" をベース テーブルの列名として解決しようとするため、クエリは失敗します。しかし、そうではありません。列の別名です。
PostgreSQL
この動作は、PostgreSQL のセクション 行の並べ替え に記載されています。 .彼らが述べた論理的根拠は、あいまいさを減らすことです。
SELECT a + b AS sum, c FROM table1 ORDER BY sum + c; -- wrong
SQL Server 2008 のドキュメント エラー
少し ORDER の エイリアスに関する別の問題BY句 .
カフェインが不十分でない限り、それはまったく真実ではありません.このステートメントは、SQL Server 2008 と SQL Server 2012 の両方で "test"."col_1" で並べ替えます。
select col_1 as col_2
from test
order by col_1;