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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 05:15:30