0

だから私はmysqlが言うことを知っています:

一般に、NULL 値を含むテーブルと空のテーブルは「エッジ ケース」です。サブクエリを作成するときは、これら 2 つの可能性を考慮しているかどうかを常に考慮してください。 http://dev.mysql.com/doc/refman/5.0/en/all-subqueries.html

しかし、これは意味がありません。私が言うなら:

select * from users where users.id NOT IN (NULL);

すべてのユーザーを返す必要はありませんか? 言う彼ら自身の論理によってさえ:

NOT IN は <> ALL のエイリアスです。したがって、これら 2 つのステートメントは同じです。

私が言うには、id が NULL と等しくないすべてのレコード、つまりすべてのレコードを返します。

したがって、問題は、そのセットが空であっても、特定のセットに含まれていないすべてのレコードを選択するにはどうすればよいかということです

明らかに、私のアプリケーション コード (Rails アプリ) では、セットが空かどうかを確認してクエリを変更できますが、それはばかげているように思えます。これをすべてSQLで行う方法はありますか?

4

1 に答える 1

2

あなたはそれが値である、または値を持っていると仮定するというよくある間違いを犯しNULLています - この場合、あなたはそれを仮定していNULL = empty setます.

NULLは未定義を意味します - したがって、すべての RDMSNULL = NULLNULLあり、NULL <> NULLまたありNULLます。それAnything = NULLNULLそのままですAnything <> NULLNULLRDMS では、数学におけるゼロ除算と同じです。

IS NULLこれが、ではなく特別な比較演算子を使用する必要がある理由です=

したがって、構造化したクエリはselect * from users where users.id NOT IN (undefined)に変換されます。そしてusers.id NOT IN (undefined)自体がundefinedです。

NULLあなたのクエリはRailsの変数からのものだと思います-私はそれをpnl(おそらくnullリスト)と呼びます。したがって、このクエリはあなたが望むものを提供します。

select * from users where users.id NOT IN (pnl) OR pnl IS NULL;
于 2013-03-21T05:08:34.753 に答える