13

このクエリが空のセットを返すのはなぜですか:

select p.iuser_id,p.produit_id from portefeuille p
WHERE produit_id=48
AND p.iuser_id NOT IN (NULL);

一方、これは:

select p.iuser_id,p.produit_id from portefeuille p
WHERE produit_id=48
LIMIT 5

のような結果を返します

72968, 48
106967, 48
7381, 48
81678, 48
194250, 48

また、これらの値はいずれも NULL ではないか、NULL に等しい必要があります。(簡潔にするために制限 5 を追加し、MySql 5.1 を使用しています)


編集: ここでは、問題を NOT IN(NULL) に絞り込みました。元のクエリには、一部の行に NULL を含むサブクエリがありました。

WHERE user_id NOT IN( select user_id from mailsubscriptions )

一部の user_id は NULL でしたが、セット内の 1 つの NULL だけがクエリ全体を汚染しています。

4

4 に答える 4

3

null と比較することは常に悪い考えです。NULL = NULLまたはNULLNULL <> NULLを返します。

IS NOT NULLinsetadを使用する

あなたの場合、クエリは次と同じです:

select p.iuser_id,p.produit_id from portefeuille p
WHERE produit_id=48
AND p.iuser_id <> NULL;

の値は の値にp.iuser_id <> NULL 関係なく NULL にp.isuer_idなり、これが空のセットを返す理由を説明しています!

于 2013-04-16T13:30:32.953 に答える
0

NULL と NULL を比較しない

IS NOT NULLここで指定する必要があります

于 2013-04-16T13:30:11.967 に答える