2016-05-18 5 views
1

1、0、NULLを含むカラムがあるとします。あなただけの1と0でグループ化すると、結果セットにあなたの2つだけではなく3行を与え、0とNULLカウント:カラムのエイリアス(NULLでのGROUP BY)は、MySQLで不正な結果を返します

SELECT SUM(aTable.whatever),IFNULL(aNullableTable.NullableColumn,0) AS TRUEORFALSE FROM aTable LEFT JOIN aNullableTable ON aTable.ID = aNullableTable.ID GROUP BY IFNULL(aNullableTable.NullableColumn,0); 
:これはと等価である必要があり、私の世界では

SELECT SUM(aTable.whatever),IFNULL(aNullableTable.NullableColumn,0) AS TRUEORFALSE FROM aTable LEFT JOIN aNullableTable ON aTable.ID = aNullableTable.ID GROUP BY TRUEORFALSE; 

しかし、そうではありません。最初の例では、列にNULLがある場合は3行を返すことがあります。 2番目の例では、NULLを正しくグループ化しています。

ここで何かを誤解していますか、これはバグですか?

のようなものでIFNULLを交換した場合の挙動が類似していることに留意すべきである:

のMySQL 5.7.11

編集上で観測

IF(NullableColumn IS NULL,0,1)IF(NullableColumn<1,0,1)IF(NullableColumn IS NOT NULL,1,0)

:おそらく、私はそれを追加する必要がありますこれは、NULL値が入っている別のテーブルにLEFT JOINするときです。私は例を編集しました。

編集:これは私が使用したためだったSELECT IFNULL(NullableColumn,0) AS NullableColumn GROUP BY NullableColumn;これはいい考えではなく、将来の参考になるため、非常に混乱した結果になります。上記の例では、GROUP BYが実際に正しく機能しなかった場合、期待どおりに0、1、NULLの代わりに2、0、1の2つの行が得られます。愚かな私。

+0

IFNULL()には2つのパラメータしかありません。3ではありません。 –

+0

ああ、そうです。ごめんなさい。私はちょうどそれを修正します。明らかに、テストされたコードでは正しいです。 – nickdnk

+0

http://sqlfiddle.com/#!9/c57094/2このデモでエラーを表示できますか? –

答えて

0

TRUEORFALSEFROM句の表の列であると考えられます。

SQL標準では、GROUP BYに列エイリアスを使用できません。したがって、列名である名前が見つかった場合は、その名前の最初の定義にする必要があります。次に、一致するカラムが見つからない場合、MySQLはカラムエイリアスを検索できます。

+1

TRUEORFALSEはテーブルの列ではありません。また、あなたはどこで別名を使うことができないのですか?私は、これが非常に可能であることを示すSQLフィドルを投稿しました。また、私はそれが完全にうまくいけば、他の場所(NULL列ではない)を使用します。 – nickdnk

+0

すみません。これは正しかった。私はちょうどエラー(私はこの記事の目的のためにそれを再構成しなければならなかったので、私はそれを修正した)を狩りしようとし、 "AS [existingTableName]"が実際に問題であったことが判明。オーバーライドするのではなく、GROUP BY *を行いますが、NULLを0に変更すると混乱します.2つの行に0、1にNULL、0、1の代わりに1を付けます。 – nickdnk

+0

まだ混乱していますこれについては: "SQL標準では、GROUP BYの列エイリアスの使用を許可していません"。 – nickdnk

関連する問題