SQL Server中如何检测两个字符串是否存在完全匹配的单词?
在SQL Server中检测两个字符串是否存在完全匹配的单词
需求说明:判断两个字符串是否包含至少一个完全匹配的独立单词。例如:
- 字符串2:
'Hello String How Are You' - 匹配场景:字符串1为
'Hello How Am I String1',存在共同单词Hello,判定匹配 - 不匹配场景:字符串1为
'Am I String1',无共同单词,判定不匹配
方案一:使用STRING_SPLIT(SQL Server 2016及以上版本)
利用内置的STRING_SPLIT函数拆分字符串为单词列表,再检查是否存在交集:
DECLARE @Str1 NVARCHAR(MAX) = 'Hello How Am I String1'; DECLARE @Str2 NVARCHAR(MAX) = 'Hello String How Are You'; IF EXISTS ( SELECT 1 FROM STRING_SPLIT(@Str1, ' ') s1 INNER JOIN STRING_SPLIT(@Str2, ' ') s2 ON s1.value = s2.value WHERE s1.value <> '' -- 过滤连续空格产生的空值 AND s2.value <> '' ) SELECT '存在匹配单词' AS Result; ELSE SELECT '无匹配单词' AS Result;
补充说明
- 如果需要忽略大小写,可修改匹配条件:
ON s1.value COLLATE SQL_Latin1_General_CP1_CI_AS = s2.value COLLATE SQL_Latin1_General_CP1_CI_AS - 若字符串包含其他分隔符(如逗号、制表符),只需替换
STRING_SPLIT的第二个参数即可。
方案二:兼容低版本SQL Server(2016之前)
自定义字符串拆分函数,再进行匹配检测:
第一步:创建拆分函数
CREATE FUNCTION dbo.SplitString ( @Input NVARCHAR(MAX), @Delimiter CHAR(1) ) RETURNS @Output TABLE (Value NVARCHAR(MAX)) AS BEGIN DECLARE @StartIndex INT = 1; DECLARE @EndIndex INT; WHILE CHARINDEX(@Delimiter, @Input, @StartIndex) > 0 BEGIN SET @EndIndex = CHARINDEX(@Delimiter, @Input, @StartIndex); INSERT INTO @Output (Value) SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - @StartIndex); SET @StartIndex = @EndIndex + 1; END INSERT INTO @Output (Value) SELECT SUBSTRING(@Input, @StartIndex, LEN(@Input) - @StartIndex + 1); RETURN; END GO
第二步:执行匹配检测
DECLARE @Str1 NVARCHAR(MAX) = 'Am I String1'; DECLARE @Str2 NVARCHAR(MAX) = 'Hello String How Are You'; IF EXISTS ( SELECT 1 FROM dbo.SplitString(@Str1, ' ') s1 INNER JOIN dbo.SplitString(@Str2, ' ') s2 ON s1.Value = s2.Value WHERE s1.Value <> '' AND s2.Value <> '' ) SELECT '存在匹配单词' AS Result; ELSE SELECT '无匹配单词' AS Result;
内容的提问来源于stack exchange,提问作者DRG
相关产品推荐
相关产品推荐

