我使用的是Server 2008,当我对外层表没有任何记录的表执行左联接时,我会从where子句中看到奇怪的行为。如果我对外层表中的值进行“null”检查,它有时会返回true。
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 = 0和b.Price不存在(或者,在select中显示为null )时,这个查询选择f.status = 0和b.Price is null的记录,尽管(FALSE或FALSE)应该是FALSE。
如果我只执行此查询,它将按预期的方式工作,并且没有在“bar”中记录的任何内容都不会被选中。
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版本有关?
发布于 2014-10-31 14:35:10
正如你所发现的,这两种配方是不一样的。
在第一个查询中,price可以是NULL,原因有两个:
left join没有匹配的地方。b.Price为空我强烈推荐第二种方法,将条件放在on子句中。但是,如果确实使用第一个列,则将其与join中使用的列进行比较
where f.id = @id and (f.status = 1 or b.id is not null)发布于 2014-10-31 14:43:49
您可以尝试这样的OUTER APPLY:
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我还建议用列代替*,糟糕的做法。外层应用程序有点像左联接,在这种情况下,它将过滤条形表中的所有数据,并只返回所需的数据。
发布于 2021-08-05 19:17:22
案件陈述有效吗?
即
选择
(等等代码)
如果b.Price为非空,则其他1 0结尾为MyBooleanCheck
来自(等等代码)
https://stackoverflow.com/questions/26677092
复制相似问题