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

Comparing something wilh NULL will result in unknown. That is why NULL values have to be compared with the IS operator.

Replace

AND g.repostVia != '34'

with

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

or use the NULL-safe equality operator (thanks to eggyal):

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

比较g.repostVia != '34'FALSE什么时候g.repostViaNULL因为任何与 NULL 的比较都将始终为 FALSE。

您应该确保NULL在与 NULL-able 列的任何比较中都涵盖了这种情况(变量 is )。

您可以使用IS NULL运算符:

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,因为在我看来,它更好地保留了比较的原始含义,并且由于它允许更多的参数,它也更灵活。

于 2012-08-17T14:09:55.097 回答
0

使用 IS NULL 进行比较绝对有效。如果您有可以分配的无效值,我想提供 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 回答
0

也许尝试<>而不是!=.

0价值观很棘手。

于 2012-08-17T13:54:34.123 回答