You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL查询修正:如何获取符合指定条件的company_disposition数据

修正PostgreSQL查询语句的问题

这问题我太熟了!你的查询出问题主要是两个点:逻辑运算符优先级搞反了,还有NULL值的判断方式不对,咱们一步步来改:

原语句的问题分析

  1. 错误的NULL判断:你写的campaign_uuid = 'null'是在找值为字符串'null'的记录,但你的目标是找真正的SQL NULL值,PostgreSQL里判断空值必须用IS NULL,不能用等于字符串的方式。
  2. 逻辑优先级错误:SQL里AND的优先级比OR高,原语句会被数据库解析成:
    (company_id = $1 AND campaign_uuid = 'null') OR campaign_uuid != $2
    
    这完全不符合你想要的「company_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 10:03:22