SQL中IN()函数失效求助:两次尝试为何均返回FALSE?
问题原因分析
你写的两段代码里IN()都返回FALSE,核心原因是你把多个公司名拼成了单个字符串变量,但IN()需要的是一组独立的值,不是带逗号分隔的整串文本。
分别看两个变量的实际作用:
- 第一个
@Company最终是字符串:'ABC', 'DEF', 'VEG', 'HIJ',但SQL会把它当成完整的一个字符串值。此时'VEG' IN (@Company)其实是判断'VEG'是否等于这个长串,显然不相等,所以返回FALSE。 - 第二个
@Company2是字符串:'ABC, DEF, VEG, HIJ',同样是单个值,'VEG'和整个串对比自然不匹配,返回FALSE。
解决方法
下面提供几种可行的修正方案:
方案1:用表变量存储多值(推荐)
把公司名存入表变量,让IN()能匹配独立的行值:
DECLARE @Companies TABLE (Name VARCHAR(50)) INSERT INTO @Companies VALUES ('ABC'), ('DEF'), ('VEG'), ('HIJ') -- 用EXISTS判断更高效 PRINT IIF(EXISTS(SELECT 1 FROM @Companies WHERE Name = 'VEG'), 'TRUE', 'FALSE')
方案2:拆分字符串为结果集
如果必须用逗号分隔的字符串,可以用STRING_SPLIT(SQL Server 2016及以上支持)拆分后再判断:
DECLARE @Company VARCHAR(50) = 'ABC, DEF, VEG, HIJ' -- 先去掉字符串里的空格,再拆分 PRINT IIF('VEG' IN (SELECT value FROM STRING_SPLIT(REPLACE(@Company, ' ', ''), ',')), 'TRUE', 'FALSE')
方案3:动态SQL(谨慎使用,注意注入风险)
把变量拼进SQL语句,让IN()识别为多值:
DECLARE @Company VARCHAR(50) = '''ABC'', ''DEF'', ''VEG'', ''HIJ''' DECLARE @SQL NVARCHAR(MAX) = 'SELECT IIF(''VEG'' IN (' + @Company + '), ''TRUE'', ''FALSE'')' EXEC sp_executesql @SQL
关键知识点
IN()的合法用法是:
- 直接写多个值:
IN('A','B','C') - 子查询返回的结果集:
IN(SELECT Name FROM Table)
不能直接传入逗号分隔的字符串,因为SQL会将其视为单一的字符串常量进行匹配。
内容的提问来源于stack exchange,提问作者JackB
相关产品推荐
相关产品推荐

