0

これはMySQL5で正常に機能します。

SELECT INSTR(foo, 'Bar') as foobar
FROM Table
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;

MySQL 4のBuでは、次のエラーが発生します。

ERROR 1054 (42S22): Unknown column 'foobar' in 'order clause'

ただし、句をこれに変更すると、両方のバージョンで機能します。

SELECT INSTR(foo, 'Bar') as foobar
FROM Table
ORDER BY CASE WHEN INSTR(foo, 'Bar') = 1 THEN foo END DESC;

互換性を確保するために、常に2番目の方法を使用する必要がありますか?

4

3 に答える 3

3

基本的に、同じ「クエリレベル」で列エイリアスを再利用することはできません。

互換性のある/移植可能な SQL を記述したいが、関数呼び出しを繰り返したくない場合は、クエリを派生テーブルにラップするのが通常の方法です。

select *
from (
  SELECT INSTR(foo, 'Bar') as foobar,
         foo
  FROM Table
) t
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;

内部クエリ内の「外部」クエリで使用する列を含める必要があることに注意してください。foo内部導出表の列を省略すると、外部レベルでアクセスできなくなります。

于 2012-11-05T11:30:55.807 に答える
1

foobarエイリアスだからです。派生クエリ(subquery)からのものでない限り、列ではありません。以下のように

SELECT * 
FROM
(
   SELECT INSTR(foo, 'Bar') as foobar
   FROM Table
) a
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;
于 2012-11-05T11:28:38.817 に答える
1

他の回答によると、ではエイリアスを使用できませんCASE
サブクエリを使用する代わりに、次のように直接使用できINSTR()ますCASE

SELECT INSTR(foo, 'Bar') as foobar
FROM Table
ORDER BY CASE WHEN INSTR(foo, 'Bar') = 1 THEN foo END DESC;

サブクエリを使用している場合は、foo列を選択して並べ替える必要があることに注意してください。そうしないと、このようなエラーが発生します

したがって、サブクエリを使用したクエリは次のようになります。

SELECT * FROM
(
    SELECT foo,INSTR(foo, 'Bar') as foobar
    FROM t
) A
ORDER BY CASE WHEN foobar = 1 THEN foo END DESC;
于 2012-11-05T11:34:53.820 に答える