首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql查询不能与空列一起工作

Mysql查询不能与空列一起工作
EN

Stack Overflow用户
提问于 2012-08-17 21:48:57
回答 4查看 130关注 0票数 0

我正在执行一个相对简单的mysql查询:

代码语言:javascript
复制
         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行,但是如果我删除最后一个条件,即将其更改为:

代码语言:javascript
复制
         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

我做错了什么?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2012-08-17 21:50:31

如果将某些东西与NULL进行比较,则会得到unknown。这就是为什么必须将NULL值与IS运算符进行比较。

替换

代码语言:javascript
复制
AND g.repostVia != '34'

使用

代码语言:javascript
复制
AND (g.repostVia != '34' or g.repostVia  is null)

或者使用NULL-safe equality operator (感谢eggyal):

代码语言:javascript
复制
AND NOT g.repostVia <=> '34'
票数 5
EN

Stack Overflow用户

发布于 2012-08-17 22:09:55

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

您应该确保在与可为空的列进行任何比较时都涵盖了这种情况(变量为NULL)。

您可以使用IS NULL运算符:

代码语言:javascript
复制
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函数:

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

票数 1
EN

Stack Overflow用户

发布于 2012-08-17 21:54:34

也许可以试试<>而不是!=

0值很棘手。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12007103

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档