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

Azure Transact SQL查询中NOT IN逻辑未按预期运行求助

问题根因

你遇到的是T-SQL中NOT IN的经典NULL值陷阱:
当device_type_id字段存在NULL值时,device_type_id NOT IN (1135, 1163)的判定结果会是未知(UNKNOWN),而WHERE子句仅会保留判定结果为TRUE的记录,所以非1135、1163的记录(含device_type_id为NULL的记录)都会被误拦截,这就是你只保留NOT IN判断时其他ID全部无法通过的原因。

最优修正方案

你的需求可以用更简洁的反向过滤逻辑实现,完全规避NOT IN的坑,逻辑和你的需求完全等价,不会出错:

WHERE
-- 仅拦截「ID为1135/1163且di_1为NULL」的记录,其余全部放行
NOT (
    messagedata.device_type_id IN (1135, 1163)
    AND messagedata.parsed.di_1 IS NULL
)

原写法兼容修正

如果你还是想沿用原来的OR写法,只需要补充NULL值的判定即可正常运行:

WHERE 
(messagedata.device_type_id NOT IN (1135, 1163) OR messagedata.device_type_id IS NULL)
OR
(messagedata.device_type_id IN (1135, 1163) AND messagedata.parsed.di_1 IS NOT NULL)

根因验证方法

你可以先执行下面的查询确认是否存在device_type_id为NULL的记录,即可验证问题原因:

SELECT COUNT(*) AS null_device_type_count FROM messagedata WHERE device_type_id IS NULL

如果返回的计数大于0,就完全匹配你遇到的故障现象。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 18:24:04