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

Laravel 5.6.7连接SQL Server时whereNotIn包含null值是否正常?

你的Laravel查询结果分析:为什么会出现vsType=-19325和null的记录?

让我们一步步拆解你的问题,看看这些记录是否正常:

关于vsType=-19325的记录

这种情况完全正常。你写的whereNotIn('vsType', [-26927, -26929])是用来排除vsType等于这两个值的记录,而-19325不在这个排除列表里。只要这条记录满足其他所有条件(比如vsStatus=632、vsCategory不在指定列表、ORI匹配,并且关联的GlobalJacket的JacketType是2),它就会被正常返回。

关于vsType=null的记录

这种情况不符合预期,根源是SQL对NULL值的特殊处理规则。在SQL里,NULL和任何值做IN或NOT IN比较的结果都是UNKNOWN,而WHERE子句只会保留判断结果为TRUE的行。所以当vsType是NULL时,vsType NOT IN (-26927, -26929)的判断结果是UNKNOWN,理论上这类记录不会被包含在结果集中。

如果你的结果里确实出现了vsType=null的记录,可以从这几个方向排查:

  • 检查你是否用了左连接(leftJoin)而不是默认的内连接(join):左连接会保留Warrant表中所有符合条件的行,哪怕没有匹配的GlobalJacket记录,这时候可能会带出vsType=null的行。
  • 查看Laravel实际生成的SQL语句:在查询末尾加上->toSql(),打印出执行的SQL,确认是否和你预期的逻辑一致:
    $query = Warrant::where('vsStatus',632)
        ->whereNotIn('vsType',[-26927,-26929])
        ->whereNotIn('vsCategory',[-15723,-21708]) // 去掉重复的-21708,不影响结果但更整洁
        ->where('Warrant.ORI','XXXXXXXXX')
        ->join('GlobalJacket','GlobalJacket.JacketID','=','Warrant.JacketID')
        ->where('GlobalJacket.JacketType','=',2);
    dd($query->toSql()); // 输出实际执行的SQL
    
  • 如果你需要明确排除vsType为null的记录,可以在查询中额外添加一个条件:
    ->whereNotNull('vsType')
    

另外提一句,你的whereNotIn('vsCategory',[-15723,-21708,-21708])里重复了-21708,虽然这不会影响查询结果,但简化成[-15723,-21708]会让代码更干净哦。

内容的提问来源于stack exchange,提问作者Kunle Adelakun

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:05:12