我正在执行一个相对简单的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行。这对我来说非常奇怪,因为在所有这些行中,int列foo都被设置为NULL
我做错了什么?
发布于 2012-08-17 21:50:31
如果将某些东西与NULL进行比较,则会得到unknown。这就是为什么必须将NULL值与IS运算符进行比较。
替换
AND g.repostVia != '34'使用
AND (g.repostVia != '34' or g.repostVia is null)或者使用NULL-safe equality operator (感谢eggyal):
AND NOT g.repostVia <=> '34'发布于 2012-08-17 22:09:55
当g.repostVia != '34'为FALSE时,比较g.repostVia为NULL,因为任何与NULL的比较都将始终为FALSE。
您应该确保在与可为空的列进行任何比较时都涵盖了这种情况(变量为NULL)。
您可以使用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-17 21:54:34
也许可以试试<>而不是!=。
0值很棘手。
https://stackoverflow.com/questions/12007103
复制相似问题