PostgreSQL查询修正:如何获取符合指定条件的company_disposition数据
修正PostgreSQL查询语句的问题
这问题我太熟了!你的查询出问题主要是两个点:逻辑运算符优先级搞反了,还有NULL值的判断方式不对,咱们一步步来改:
原语句的问题分析
- 错误的NULL判断:你写的
campaign_uuid = 'null'是在找值为字符串'null'的记录,但你的目标是找真正的SQL NULL值,PostgreSQL里判断空值必须用IS NULL,不能用等于字符串的方式。 - 逻辑优先级错误:SQL里
AND的优先级比OR高,原语句会被数据库解析成:
这完全不符合你想要的「(company_id = $1 AND campaign_uuid = 'null') OR campaign_uuid != $2company_id = $1且(campaign_uuid为NULL 或campaign_uuid != $2)」的逻辑。
修正后的查询语句
SELECT * FROM company_disposition WHERE company_id = $1 AND (campaign_uuid IS NULL OR campaign_uuid != $2);
为什么这样改?
- 用
campaign_uuid IS NULL精准匹配SQL NULL值,对应你测试数据里那条campaign_uuid: null的记录。 - 给
OR的条件加上括号,强制让数据库先计算括号内的逻辑(空值或者不等于$2),再和外面的company_id = $1做AND判断,完美符合你的需求。
用你的测试数据举例:当$1 = 'be1b5ee1-51e7-422b-b469-592dbd62bec9',$2 = 'fd80a1fa-947d-4b09-a755-cee5951b6c85'时,这条语句会准确返回campaign_uuid为NULL的那条数据——另一条的campaign_uuid等于$2,会被campaign_uuid != $2排除掉。
额外小提醒
如果你的$2参数有可能是NULL的话,campaign_uuid != $2是无法匹配任何值的(因为NULL和任何值比较都是未知),这时候可以用campaign_uuid IS DISTINCT FROM $2来替代,它能正确处理NULL的比较场景。不过从你的需求来看,目前用!=就足够啦。
内容的提问来源于stack exchange,提问作者Andrey Radkevich
相关产品推荐
相关产品推荐

