首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL:当'value‘为null时,检查'value’是不是null返回TRUE

SQL:当'value‘为null时,检查'value’是不是null返回TRUE
EN

Stack Overflow用户
提问于 2014-10-31 14:31:23
回答 3查看 2K关注 0票数 0

我使用的是Server 2008,当我对外层表没有任何记录的表执行左联接时,我会从where子句中看到奇怪的行为。如果我对外层表中的值进行“null”检查,它有时会返回true。

代码语言:javascript
复制
select *
from foo f left join bar b on b.id=f.id
where f.id=@id and (f.status = 1 or b.Price is not null)

当我的f.status = 0b.Price不存在(或者,在select中显示为null )时,这个查询选择f.status = 0b.Price is null的记录,尽管(FALSE或FALSE)应该是FALSE。

如果我只执行此查询,它将按预期的方式工作,并且没有在“bar”中记录的任何内容都不会被选中。

代码语言:javascript
复制
select *
from foo f left join bar b on b.id=f.id
where f.id=@id and b.Price is not null

b.Price is not null作为or操作的一部分似乎是出于某种原因引起了问题。这个查询可能有什么问题?我在Server 2012机器上使用类似的数据运行相同的查询,但没有看到这个问题,这是否与我所使用的Server版本有关?

EN

回答 3

Stack Overflow用户

发布于 2014-10-31 14:35:10

正如你所发现的,这两种配方是不一样的。

在第一个查询中,price可以是NULL,原因有两个:

  • left join没有匹配的地方。
  • 有一个匹配,b.Price为空

我强烈推荐第二种方法,将条件放在on子句中。但是,如果确实使用第一个列,则将其与join中使用的列进行比较

代码语言:javascript
复制
where f.id = @id and (f.status = 1 or b.id is not null)
票数 1
EN

Stack Overflow用户

发布于 2014-10-31 14:43:49

您可以尝试这样的OUTER APPLY

代码语言:javascript
复制
SELECT *
FROM foo f
OUTER APPLY (
SELECT *
FROM bar b
WHERE f.id = b.id
    AND (
        f.STATUS = 1
        OR b.Price IS NOT NULL
        ) b
)
WHERE f.id = @id

我还建议用列代替*,糟糕的做法。外层应用程序有点像左联接,在这种情况下,它将过滤条形表中的所有数据,并只返回所需的数据。

票数 1
EN

Stack Overflow用户

发布于 2021-08-05 19:17:22

案件陈述有效吗?

选择

(等等代码)

如果b.Price为非空,则其他1 0结尾为MyBooleanCheck

来自(等等代码)

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

https://stackoverflow.com/questions/26677092

复制
相关文章

相似问题

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