SQL中用SplitString函数结合IN子句查询NULL值的解决方案
解决SQL IN子句无法匹配NULL值的问题
因为SQL的IN操作符会忽略NULL值,所以直接用IN无法同时匹配拆分结果里的普通字符串和NULL。以下是两种实用的解决方式:
方法一:拆分结果包含NULL时,单独补充NULL判断
把查询条件拆成两部分:一部分匹配拆分后的非NULL值,另一部分在拆分结果存在NULL时,匹配表中ModelName为NULL的记录。
SELECT * FROM Modeltable WHERE -- 匹配拆分后的非NULL字符串 ModelName IN (SELECT [Value] FROM XYZ.SplitString(N';01e178bd-8f6c-488f-a0fa-81ffb598e569', ';') s WHERE [Value] IS NOT NULL) -- 当拆分结果里有NULL时,额外匹配表中ModelName为NULL的行 OR ( ModelName IS NULL AND EXISTS (SELECT 1 FROM XYZ.SplitString(N';01e178bd-8f6c-488f-a0fa-81ffb598e569', ';') s WHERE [Value] IS NULL) )
方法二:用EXISTS替代IN,兼容NULL匹配
改用EXISTS子句,通过明确的条件同时处理普通字符串相等和两边均为NULL的场景:
SELECT * FROM Modeltable m WHERE EXISTS ( SELECT 1 FROM XYZ.SplitString(N';01e178bd-8f6c-488f-a0fa-81ffb598e569', ';') s -- 同时处理正常相等和两边都是NULL的情况 WHERE (m.ModelName = s.[Value] OR (m.ModelName IS NULL AND s.[Value] IS NULL)) )
如果你的SQL版本支持IS NOT DISTINCT FROM(比如SQL Server 2022及以上、PostgreSQL),可以简化判断逻辑:
SELECT * FROM Modeltable m WHERE EXISTS ( SELECT 1 FROM XYZ.SplitString(N';01e178bd-8f6c-488f-a0fa-81ffb598e569', ';') s WHERE m.ModelName IS NOT DISTINCT FROM s.[Value] )
内容的提问来源于stack exchange,提问作者Mahbub
相关产品推荐
相关产品推荐

