在数据库管理与数据分析中,经常需要判断一个字段的内容是否包含另一个字段的值,或基于字段包含关系进行数据筛选、关联和处理,查询产品名称中包含分类关键词的记录,或判断客户备注是否包含特定订单号等,本文将详细介绍在 SQL Server 中实现“一个字段包含另一个字段”的多种方法,并结合实例演示具体应用场景。
使用字符串函数进行直接包含判断
当需要在单表内判断一个字段是否包含另一个字段的值时,可利用 SQL Server 提供的字符串函数,通过模糊匹配或位置检测实现。
1 使用 LIKE 运算符(模糊匹配)
LIKE 是最常用的模糊匹配运算符,支持通配符 (任意多个字符)和 _(单个字符),判断字段 A 是否包含字段 B,可使用 A LIKE '%' + B + '%'。

语法示例:
假设 Employees 表包含 EmployeeID(员工ID)、Name(姓名)、Skills(技能列表,用逗号分隔),查询技能列表中包含姓名关键字的员工:
SELECT EmployeeID, Name, Skills FROM Employees WHERE Skills LIKE '%' + Name + '%';
注意事项:
LIKE '%...%'会导致索引失效,大数据量时性能较差;若字段有前缀匹配需求(如LIKE 'SQL%'),可利用索引优化。若
Name或Skills包含 NULL 值,结果可能不符合预期(NULL 与任何值拼接均为 NULL),建议用ISNULL或COALESCE处理:WHERE Skills LIKE '%' + ISNULL(Name, '') + '%';
2 使用 CHARINDEX 函数(位置检测)
CHARINDEX 函数返回子字符串在源字符串中的起始位置(从1开始),若未找到则返回 0,通过判断 CHARINDEX(B, A) > 0 可检测字段 A 是否包含字段 B。
语法示例:
查询 Products 表中 ProductName(产品名称)包含 CategoryName(分类名称)的产品:
SELECT ProductID, ProductName, CategoryName FROM Products WHERE CHARINDEX(CategoryName, ProductName) > 0;
优势:
CHARINDEX对 NULL 值的处理更明确:若任一参数为 NULL,则返回 NULL,需结合ISNULL使用:WHERE CHARINDEX(ISNULL(CategoryName, ''), ISNULL(ProductName, '')) > 0;
相比
LIKE,CHARINDEX更适合需要精确判断包含逻辑的场景(如结合 CASE WHEN 进行复杂条件分支)。
3 使用 PATINDEX 函数(模式匹配)
PATINDEX 与 LIKE 类似,支持通配符模式匹配,但返回子字符串首次出现的位置(从1开始),未找到则返回 0,适用于需要更灵活模式(如区分大小写、特殊字符)的场景。
语法示例:
查询 Orders 表中 Remark(备注)包含 OrderID(订单号,格式为 "ORD+数字")

