传入参数可能为null时,如何修正SQL查询以获取正确结果?
解决方案:单条SQL适配参数为NULL/非NULL的场景
不用写分支查询,有两种方案可以实现需求:
方案1:使用IS NOT DISTINCT FROM(部分数据库支持)
这条语句会自动处理NULL的匹配逻辑:当参数$1为NULL时,匹配表中name为NULL的行;当参数为非NULL值时,匹配name等于该值的行。
select id from tasks where name IS NOT DISTINCT FROM $1
适用数据库:PostgreSQL、SQLite(3.39.0+)、Oracle(12cR2+)等。
方案2:通用条件判断(兼容所有SQL数据库)
如果你的数据库不支持IS NOT DISTINCT FROM,可以用逻辑组合实现:
select id from tasks where (name = $1) OR (name IS NULL AND $1 IS NULL)
逻辑说明:
- 当
$1为非NULL值时,(name IS NULL AND $1 IS NULL)不成立,只会执行name = $1的匹配,返回对应行; - 当
$1为NULL时,name = $1的结果为NULL(不成立),此时会触发name IS NULL AND $1 IS NULL的条件,返回表中name为NULL的行。
为什么WHERE name = $1 OR name IS NULL不行?
因为当$1为非NULL值(比如task1)时,name IS NULL的条件依然成立,会把表中所有name为NULL的行也一并返回,不符合你只需要匹配$1对应值的需求。
内容的提问来源于stack exchange,提问作者Violetta
相关产品推荐
相关产品推荐

