我有点惊讶地发现Google Big Query中的WHERE语句忽略了NULLS。有谁知道更好的方法吗?
我有以下数据集:
Name Score
Allan 20
Brian NULL
Clare 30
假设我想选择分数不等于20的所有记录。如果我在Big Query中使用以下代码
SELECT * FROM [....]
where
Score <> 20
以下是结果:
Name Score
Clare 30
问题是Brian的NULL记录也不等于20,因此应该在我的结果中。
除了特别检查NULLS之外还有更好的方法吗?
由于 利雅
答案 0 :(得分:7)
SQL(以及类似SQL的BigQuery)具有三价逻辑。归结为,语句不能只是TRUE或FALSE,它们也可以是NULL。在这种情况下,语句NULL&lt;&gt; 20既不是TRUE也不是FALSE,它本身是NULL。将NULL值视为未知可能会有所帮助。由于我们不知道Brian的年龄,我们不知道它是否等于20.但是查询只返回where子句求值为TRUE的行,因此排除了带有Brian的行。
如果要包含NULL值,则必须显式写入
where (Score <> 20 or Score is null)
答案 1 :(得分:3)
select * from [...]
where coalesce(score, 0) <> 20
答案 2 :(得分:2)
另一个变种:
SELECT * FROM [...] if wherenull(得分&lt;&gt; 20,true)
我喜欢它表达“从这个表达式接受TRUE或NULL布尔值;拒绝FALSE。”
答案 3 :(得分:0)
如何实现 -
SELECT * FROM [....]
where
Score <> 20 or Scrore is NULL
有没有有效的方法 -
为避免这种性能查杀方式,我们应将列属性保留为not null
。