SQLite中处理可为NULL值匹配的查询问题
解决SQLite中NULL参数的匹配问题
嘿,这个问题我之前也踩过坑!核心原因是SQL里的=运算符没法处理NULL的相等性——当?1是NULL时,project = ?1永远不会返回真,哪怕project也是NULL,因为NULL和任何值比较的结果都是NULL(会被视为假)。
要实现两个可为NULL的值是否匹配(不管两边是不是NULL),SQLite里有个专门的运算符:IS。它正好能处理包含NULL的相等判断:
- 当两边都是非NULL且值相等时,返回真
- 当两边都是NULL时,同样返回真
- 其他不匹配的情况返回假
你只需要把查询里所有的project = ?1替换成project IS ?1就行,完全不用拆成两个独立查询。修改后的完整SQL如下:
SELECT max(e), url, branch FROM ( SELECT max(T1.entry) e, T1.url, T1.branch FROM repo_history T1 WHERE ( SELECT active FROM repos T2 WHERE url = T1.url AND branch = T1.branch AND project IS ?1 ) GROUP BY T1.url, T1.branch UNION SELECT null, T3.url, T3.branch FROM repos T3 WHERE active AND project IS ?1 ) GROUP BY url ORDER BY e
如果出于某些特殊原因不想用IS,也可以用逻辑表达式手动处理NULL场景,把project = ?1改成:(project = ?1 OR (project IS NULL AND ?1 IS NULL))
不过显然IS更简洁直观,是SQL标准里专门解决这类NULL匹配问题的语法。
内容的提问来源于stack exchange,提问作者SoniEx2
相关产品推荐
相关产品推荐

