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

SQL Server:如何将逗号分隔列值转为IN语句所需的单引号格式

我完全懂你的问题所在了!你原来的查询之所以查不到结果,是因为SQL Server把[T]列里的整个逗号分隔字符串当成了单一值来处理,而不是拆分成一个个独立的编号去匹配[NUMBER]列。别着急,我给你几个实用的解决方案:

方案1:使用内置的STRING_SPLIT函数(SQL Server 2016及以上版本)

这是最省心的方法,SQL Server 2016及以后版本自带了STRING_SPLIT函数,配合CROSS APPLY就能直接把逗号分隔的字符串拆分成单独的行:

SELECT * 
FROM [dbo].[TABLE] 
WHERE [NUMBER] IN (
    -- 拆分[T]列的每个值,得到独立的编号行
    SELECT value 
    FROM [dbo].[TEST]
    CROSS APPLY STRING_SPLIT([T], ',')
)

简单解释下:CROSS APPLY会把TEST表中每一行的[T]值拆分成多个行,每个行对应一个编号,这样IN子查询就拿到了AS00516003、QD00516009、XD00516089这三个独立的值,自然就能正确匹配[NUMBER]列了。

方案2:自定义字符串拆分函数(适用于SQL Server 2016以下版本)

如果你的SQL Server版本比较老,没有STRING_SPLIT,可以自己创建一个表值拆分函数来处理:

CREATE FUNCTION dbo.SplitString
(
    @InputString NVARCHAR(MAX),
    @Delimiter NVARCHAR(5)
)
RETURNS @OutputTable TABLE (Value NVARCHAR(100))
AS
BEGIN
    DECLARE @StartIndex INT, @EndIndex INT

    SET @StartIndex = 1
    -- 确保字符串末尾有分隔符,避免遗漏最后一个值
    IF SUBSTRING(@InputString, LEN(@InputString), 1) <> @Delimiter
    BEGIN
        SET @InputString = @InputString + @Delimiter
    END

    WHILE CHARINDEX(@Delimiter, @InputString) > 0
    BEGIN
        SET @EndIndex = CHARINDEX(@Delimiter, @InputString)
        
        INSERT INTO @OutputTable(Value)
        SELECT SUBSTRING(@InputString, @StartIndex, @EndIndex - @StartIndex)
        
        -- 截取剩余的字符串继续处理
        SET @InputString = SUBSTRING(@InputString, @EndIndex + 1, LEN(@InputString))
    END

    RETURN
END
GO

创建好函数后,用同样的方式查询即可:

SELECT * 
FROM [dbo].[TABLE] 
WHERE [NUMBER] IN (
    SELECT Value 
    FROM [dbo].[TEST]
    CROSS APPLY dbo.SplitString([T], ',')
)
关于你提到的“转成带单引号格式”的补充

你之前想把值转成'AS00516003','QD00516009','XD00516089'这种格式,其实可以用动态SQL实现,但要注意SQL注入风险——如果[T]列的内容不可信(比如包含单引号或特殊字符),可能会导致查询错误甚至安全问题。示例代码如下:

DECLARE @inClause NVARCHAR(MAX)
-- 替换逗号为','',再给整个字符串前后加上单引号
SELECT @inClause = '''' + REPLACE([T], ',', ''',''') + '''' FROM [dbo].[TEST]

-- 构建动态SQL并执行
DECLARE @sql NVARCHAR(MAX) = N'SELECT * FROM [dbo].[TABLE] WHERE [NUMBER] IN (' + @inClause + N')'
EXEC sp_executesql @sql

不过还是更推荐前两种方案,因为它们更安全,也更符合SQL的最佳实践,不需要拼接字符串,避免了注入风险。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:15:17