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

SQL Server中如何实现逗号分隔字符串的WHERE IN匹配查询

解决方案

以下方案适配你使用的SQL Server数据库场景:

方法一:SQL Server 2016及以上版本(推荐,原生函数性能更优)

DECLARE @brand_id varchar(50) = 'brand1, brand2'
-- 先去除参数中的空格避免匹配失败
SET @brand_id = REPLACE(@brand_id, ' ', '')

SELECT c.related_brand_id
FROM dbo.Category c
WHERE EXISTS (
    SELECT 1
    FROM STRING_SPLIT(@brand_id, ',') s
    -- 前后拼接逗号避免部分匹配(比如误匹配到brand11这类近似ID)
    WHERE ',' + c.related_brand_id + ',' LIKE '%,' + s.value + ',%'
)

逻辑说明:用原生STRING_SPLIT函数把逗号分隔的参数拆成单个品牌ID的列表,EXISTS子查询逐行判断当前行的related_brand_id是否包含任意一个拆分出来的品牌ID,符合条件的行就会返回。

方法二:低版本SQL Server(不支持STRING_SPLIT)

无需自定义函数,用XML方式拆分字符串即可:

DECLARE @brand_id varchar(50) = 'brand1, brand2'
SET @brand_id = REPLACE(@brand_id, ' ', '')

-- 转换为XML格式实现字符串拆分
DECLARE @brand_xml XML = CONVERT(XML, '<root><s>' + REPLACE(@brand_id, ',', '</s><s>') + '</s></root>')

SELECT c.related_brand_id
FROM dbo.Category c
WHERE EXISTS (
    SELECT 1
    FROM @brand_xml.nodes('/root/s') t(x)
    WHERE ',' + c.related_brand_id + ',' LIKE '%,' + t.x.value('.', 'varchar(50)') + ',%'
)

注意事项

  • 如果你能确认所有品牌ID不存在互相包含的情况(比如不会同时出现brand1和brand11),可以简化匹配逻辑:把LIKE判断替换为WHERE CHARINDEX(s.value, c.related_brand_id) > 0即可
  • 如果参数的逗号分隔符前后可能存在空格,一定要先做去空格处理,否则会出现匹配失败的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 20:45:03