sql >> データベース >  >> RDS >> Sqlserver

CASE を使用して ORDER BY で列エイリアスを参照できないのはなぜですか?

    これは、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;
    


    1. mysqlを5.5から5.6にアップグレードした後の遅いクエリ

    2. 「ヘルプ」主キー列をサーバーで生成できません

    3. GROUP BY/SQLでの集計関数の混乱

    4. PHP、MYSQLオートコンプリートが機能しない