Snowflake中“=”与“IN”查询行为差异:为何Query1返回多行Query2无结果?
查询行为差异解释
Query 1:col_c = col_c 的过滤逻辑
这个条件是逐行自比较:
- 当
col_c为非NULL值时,col_c = col_c结果为TRUE,符合WHERE子句的过滤要求,行会被保留; - 当
col_c为NULL时,SQL中NULL = NULL的结果是UNKNOWN,这类行会被WHERE子句自动过滤。
结合col_timestamp = MAX(col_timestamp)的条件,Query1返回的是所有时间戳等于最大时间戳且col_c非NULL的行,因此会返回大量数据。
Query 2:col_c IN (col_c) 的过滤逻辑
这里的(col_c)会被Snowflake解析为整个表t的col_c值集合(等价于执行SELECT col_c FROM t作为IN的子查询)。核心差异在于IN子句对NULL的特殊处理:
- 如果表
t中存在任何col_c为NULL的行,那么这个集合会包含NULL值; - 若满足时间戳条件的行的
col_c是唯一值(即表中只有这些行的col_c为该值,其他行的col_c都是NULL),此时判断col_c IN (包含NULL的集合)时,SQL会返回UNKNOWN; - 所有结果为
UNKNOWN的行都会被WHERE子句过滤,最终Query2返回零行。
内容的提问来源于stack exchange,提问作者slothish1
相关产品推荐
相关产品推荐

