多列非空校验SQL查询仍返回含NULL行,求问题排查
问题原因与修正方案
你的核心错误是用错了COALESCE的逻辑:COALESCE的作用是返回传入参数里第一个非NULL的值,只要你指定的列中有任意一个不为NULL,整个表达式就会返回非NULL,完全没检查所有要求的列是否都满足非空条件。举个例子:如果gameTitle是NULL,但gameDevTeam有值,COALESCE会直接返回gameDevTeam,导致这条存在NULL值的行被错误返回,根本达不到你“指定列(除innerId/outerId二选一)都非空”的要求。
正确的SQL查询
要实现需求,必须把每个强制非空的列单独做IS NOT NULL判断,再加上innerId和outerId至少一个非空的逻辑:
SELECT * FROM GameData gd WHERE gd.dev_Status = 002 AND gd.gameType IN (003, 004) -- 以下列必须全部非NULL AND gd.gameTitle IS NOT NULL AND gd.gameDevTeam IS NOT NULL AND gd.prodCode IS NOT NULL AND gd.teamCode IS NOT NULL -- innerId与outerId至少一个非NULL AND (gd.innerId IS NOT NULL OR gd.outerId IS NOT NULL)
补充说明:因为gameType IN (003, 004)会自动排除gameType为NULL的行(NULL值不满足IN条件),所以可以不用额外写gd.gameType IS NOT NULL,如果要更严谨也可以加上。
内容的提问来源于stack exchange,提问作者SkyeBoniwell
相关产品推荐
相关产品推荐

