0

私は比較的単純なmysqlクエリを実行しています:

         SELECT g.id FROM myTable g
            WHERE g.timestamp > '0' 
            AND g.userId = '1'
            AND g.foo != '34'
            ORDER BY g.id DESC LIMIT 0, 10

このクエリは0行を返しますが、最後の条件を削除した場合、つまり次のように変更した場合。

         SELECT g.id FROM myTable g
            WHERE g.timestamp > '0' 
            AND g.userId = '1'
            ORDER BY g.id DESC LIMIT 0, 10

これは5〜6行を返します。これらのすべての行でintfooがNULLに設定されて いるため、これは私には非常に奇妙です。

私は何が間違っているのですか?

4

4 に答える 4

5

何かNULLを比較すると、結果はになりunknownます。そのため、NULL値を演算子と比較する必要がありますIS

交換

AND g.repostVia != '34'

AND (g.repostVia != '34' or g.repostVia  is null)

または、NULLセーフな等式演算子を使用します(eggyalに感謝):

AND NOT g.repostVia <=> '34'
于 2012-08-17T13:50:30.783 に答える
1

比較g.repostVia != '34'FALSE、 NULLとの比較g.repostViaNULL常にFALSEになるためです。

NULLNULL可能な列との比較では、このケース(変数は)をカバーしていることを確認する必要があります。

ISNULL演算子を使用できます。

SELECT g.id FROM myTable g
            WHERE g.timestamp > '0' 
            AND g.userId = '1'
            AND (g.repostVia, != '34' OR g.repostVia IS NULL)
            ORDER BY g.id DESC LIMIT 0, 10

またはCOALESCE関数:

SELECT g.id FROM myTable g
            WHERE g.timestamp > '0' 
            AND g.userId = '1'
            AND COALESCE(g.repostVia, -1) != '34'
            ORDER BY g.id DESC LIMIT 0, 10

私自身、COALESCEを好みます。これは、COALESCEが元の比較の意味をよりよく保持し、より多くのパラメーターを許可するため、より柔軟になるためです。

于 2012-08-17T14:09:55.097 に答える
0

多分<>代わりに試してみてください!=

0値には注意が必要です。

于 2012-08-17T13:54:34.123 に答える
0

ISNULLを使用して比較を行うことは間違いなく有効です。割り当てることができる無効な値がある場合、COALESCE()がもう少し読みやすくなることを提供したいと思います。たとえば、g.fooが常に正の場合、次のように機能します。

     SELECT g.id FROM myTable g
         WHERE g.timestamp > '0'
          AND g.userId = '1'
         AND coalesce(g.foo, -1) != '34'
         ORDER BY g.id DESC
     LIMIT 0, 10 
于 2012-08-17T14:11:17.403 に答える