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
相关产品推荐
相关产品推荐

