当我获得不同的记录计数时,出现了这个问题,我认为这是相同的查询,一个使用not in
where
约束,另一个使用a left join
。not in
约束中的表具有一个空值(错误数据),该空值导致该查询返回计数为0的记录。我有点理解为什么,但是我可以使用一些帮助来完全理解这个概念。
简单地说,为什么查询A返回结果而B不返回结果?
A: select 'true' where 3 in (1, 2, 3, null)
B: select 'true' where 3 not in (1, 2, null)
这是在SQL Server 2005上。我还发现调用set ansi_nulls off
导致B返回结果。
查询A与以下内容相同:
select 'true' where 3 = 1 or 3 = 2 or 3 = 3 or 3 = null
既然3 = 3
是真的,那么您会得到结果。
查询B与以下内容相同:
select 'true' where 3 <> 1 and 3 <> 2 and 3 <> null
如果ansi_nulls
是,3 <> null
是未知的,所以谓词计算结果为未知的,你没有得到任何行。
当ansi_nulls
off3 <> null
为true时,谓词为true,因此谓词的值为true,您将获得一行。
问题内容: 我有一个这样的表“ bla”: 如果我做SQL查询 我只得到ID为2的记录。我没有ID为3的记录,其中fk为空。我以为NULL!=4。看来这是错误的。 为什么会这样呢? 问题答案: 不等于任何东西。您需要明确接受null: 有关处理的更多信息,请参见使用NULL。
问题内容: 如何检查值(@param为空) 前任: 如果我想将比较值(IS NULL)替换为@param。如何才能做到这一点 如何实现? 问题答案:
问题内容: 是否可以在更新语句中为int列设置NULL值? 在这种情况下,如何编写更新语句? 问题答案: 假设该列设置为支持NULL作为值: 请注意数据库的NULL处理-默认情况下,在SQL Server中,NULL是INT。因此,如果列是不同的数据类型,则需要CAST / CONVERT NULL为正确的数据类型: 在上面的示例中,假设是DATETIME数据类型。
问题内容: 在我的表中,我有一个可为空的bit列(旧系统…),另一位开发人员最近对存储过程进行了更改,以仅显示bit列不为真的值(1)。因为这是一个可为空的列,所以我们注意到,如果该列为NULL,则不会选择该记录。为什么是这样? 我和其他开发人员都同意NULL <> 1 …这是SQL中的错误还是设计这种方式?似乎是设计缺陷。 当前代码: 建议的修复: (Jon Erickson) VoidedIn
但是,当我只想要子项时,我会得到。 这就是我如何尝试只获得键和值(几乎相同,只是添加了额外的:
问题内容: 有没有一种方法可以在SQLAlchemy中构建与以下对象等效的对象: 根据我在文档中看到的内容,该子句仅与一起使用。 问题答案: 插入中的“ VALUES”是标准SQL,独立的“ VALUES”关键字是Postgresql。PGValues上有一份针对此的快速编译器配方(如果有一天我更改了维基,请在此处复制):