SQL Server 判断一个字符串是否包含指定字符或子串的方法

纸上星河
纸上星河
发布时间:2026-10-15 | 4人浏览过
原创

在 SQL Server 数据库开发中,经常需要判断某个字段内容是否包含特定的关键词或字符组合。利用内置的 CHARINDEX 函数,可以高效地实现这一需求。本文详解了针对“分隔符比对”和“逐字匹配”两种常见场景的实现思路,并提供完整的自定义函数代码,帮助用户在复杂查询中轻松处理字符串包含关系。

使用 CHARINDEX 进行基础查找

CHARINDEX(substring, string) 是 SQL Server 中最常用的字符串查找函数。它返回子字符串在目标字符串中第一次出现的位置;如果未找到,则返回 0。这是判断“是否包含”的基础逻辑:只要返回值大于 0,即表示包含。

版本一:基于分隔符拆分比对

在处理如标签、ID列表等由特定符号(例如逗号 ,)分隔的数据时,往往需要验证一组键值中的每一个是否都存在于另一个列表中。虽然简单的 LIKE '%...%' 可以判断包含,但若需精确匹配分隔开的片段,建议采用循环截取的方式。

实现逻辑:以指定的分隔符将待搜索的长字符串拆解,逐个片段去目标字符串中寻找。一旦找到任意一个匹配的片段,立即返回 1(匹配成功);若循环结束仍未找到,则返回 0。

-- 使用示例数据库
USE [Fly]
GO

-- 定义函数:检查 @inStr 中是否包含 @fndStr 里的任一分隔片段
-- 参数说明:
-- @inStr:  被搜索的主字符串
-- @fndStr: 包含多个片段的搜索串
-- @doc:    分隔符
CREATE FUNCTION CGF_FN_Search(@inStr VARCHAR(500),@fndStr VARCHAR(500),@doc VARCHAR(5))
RETURNS INT
AS
BEGIN
	DECLARE @i INT,	@c VARCHAR(500),@fStr VARCHAR(500)
	SET @fStr = @fndStr

	WHILE(LEN(@fStr) > 0)
	BEGIN
		-- 查找分隔符位置
		SET @i = Charindex(@doc, @fStr)
		IF(@i = 0)
		BEGIN
			-- 最后一个片段,直接在主串中查找
			IF(CHARINDEX(@fStr,@inStr) > 0)
				RETURN 1
			ELSE
				RETURN 0
		END
		ELSE
		BEGIN
			-- 截取当前片段
			SET @c = SUBSTRING(@fStr,1,@i-1)
			-- 如果主串中包含该片段,则匹配成功
			IF(CHARINDEX(@c,@inStr) > 0)
				RETURN 1
			-- 否则截取剩余部分继续循环
			SET @fStr = SUBSTRING(@fStr,@i+LEN(@doc),LEN(@fStr))
		END
	END
	RETURN 0
END
GO

-- 测试用例
-- SELECT dbo.CGF_FN_Search('1,2,3,4,5,6','3,6,5,8,2',',') -- 预期返回 1 (因为 3,5,6,2 都存在)

版本二:逐字匹配查找

如果需求变为检查目标字符串是否包含源字符串中的任意单个字符(例如判断密码强度中是否包含大写字母,或验证码校验),可以使用逐字遍历的方法。

实现逻辑:依次提取搜索串的每一个字符,在目标串中进行 CHARINDEX 查找。只要有一个字符出现在目标串中,即可提前终止并返回 1。

-- 定义函数:检查 @inStr 中是否包含 @fndStr 中的任意一个字符
CREATE FUNCTION [dbo].[CGF_FN_SearchChar](@inStr VARCHAR(500),@fndStr VARCHAR(500))
RETURNS INT
AS
BEGIN
	DECLARE @i INT,@f INT,@c VARCHAR(1)
	SET @i = 1
	SET @f = LEN(@fndStr)

	WHILE(@i <= @f)
	BEGIN
		-- 获取当前位置的字符
		SET @c = SUBSTRING(@fndStr, @i, 1) 
		IF(CHARINDEX(@c,@inStr) > 0)
		BEGIN
			RETURN 1
		END
		SET @i = @i + 1
	END
	RETURN 0
END
GO

-- 注意:此处修正了原草稿中 SUBSTRING 参数写错的笔误,确保正确截取单字符

应用与总结

上述两个自定义函数(CGF_FN_Search 和 CGF_FN_SearchChar)可以被封装在数据库中供全局调用。在编写复杂的报表 SQL 或数据清洗脚本时,可以直接将它们作为计算列嵌入查询语句,例如:Select *, dbo.CGF_FN_Search(str, 'keywords', ',') as MatchResult from TableA。

需要注意的是,对于极其庞大的数据量和极长的字符串,频繁的标量函数调用可能会影响性能。在实际生产环境中,应结合具体的业务频率和索引策略进行评估。以上就是 SQL Server 比较字符串包含关系的详细内容,更多关于 SQL Server 字符串处理技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表