MS SQL Server中匹配连续行文本序列,返回存在性布尔判断
检测SQL Server表中是否存在连续指定单词序列
针对你的需求,我整理了一个可行的SQL方案,能准确判断表中是否存在你要找的连续单词序列,不管是两个还是多个单词的组合都适用。
核心思路
我们需要先把目标搜索序列拆分成单个单词,然后在原表中找到这些单词的位置,检查它们的Sequence是否是连续递增且和目标序列顺序一致的。
完整SQL实现(适用于SQL Server 2016及以上)
-- 定义要搜索的目标单词序列,这里可以替换成任意你需要的序列 DECLARE @SearchSequence NVARCHAR(100) = 'Hello Dave'; WITH SplitSequence AS ( -- 拆分目标序列为带序号的单词列表 SELECT value AS Word, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS SeqNum FROM STRING_SPLIT(@SearchSequence, ' ') WHERE value <> '' -- 过滤拆分后可能出现的空字符串 ), MatchingPositions AS ( -- 匹配原表中的单词,并计算每个匹配项对应的"起始Sequence" SELECT t.[Sequence], ss.SeqNum, t.[Sequence] - ss.SeqNum + 1 AS StartSequence FROM dbo.testTable t -- 注意:因为你的Text字段是nchar(10),会自动补空格,所以要先trim掉前后空格再匹配 JOIN SplitSequence ss ON LTRIM(RTRIM(t.[Text])) = ss.Word ) -- 检查是否存在一组完整的连续匹配 SELECT CASE WHEN EXISTS ( SELECT StartSequence FROM MatchingPositions GROUP BY StartSequence -- 确保当前起始位置覆盖了目标序列的所有单词 HAVING COUNT(DISTINCT SeqNum) = (SELECT COUNT(*) FROM SplitSequence) ) THEN 'True' ELSE 'False' END AS SequenceExists;
逻辑解释
- SplitSequence CTE:使用
STRING_SPLIT把输入的搜索字符串按空格拆分,给每个单词分配一个序号(SeqNum),代表它在目标序列中的位置。 - MatchingPositions CTE:将原表中的单词和拆分后的单词匹配(先处理
Text字段的空格问题),然后计算每个匹配项对应的"起始Sequence"——比如如果这个单词是目标序列的第2个,那么起始Sequence就是当前Sequence减1(2-1=1)。 - 最后通过
EXISTS检查:是否存在某个StartSequence,对应的匹配项数量正好等于目标序列的单词数,说明这一组是连续且完整的匹配。
兼容低版本SQL Server(2016以下)
如果你的SQL Server版本不支持STRING_SPLIT,可以用递归CTE来拆分字符串,替换上面的SplitSequence部分:
WITH SplitSequence AS ( SELECT CAST(LEFT(@SearchSequence, CHARINDEX(' ', @SearchSequence + ' ') - 1) AS NVARCHAR(10)) AS Word, CAST(RIGHT(@SearchSequence, LEN(@SearchSequence) - CHARINDEX(' ', @SearchSequence + ' ')) AS NVARCHAR(100)) AS Remaining, 1 AS SeqNum UNION ALL SELECT CAST(LEFT(Remaining, CHARINDEX(' ', Remaining + ' ') - 1) AS NVARCHAR(10)) AS Word, CAST(RIGHT(Remaining, LEN(Remaining) - CHARINDEX(' ', Remaining + ' ')) AS NVARCHAR(100)) AS Remaining, SeqNum + 1 FROM SplitSequence WHERE Remaining <> '' ) SELECT Word, SeqNum FROM SplitSequence;
测试案例
- 搜索
'Hello Dave':原表中Sequence=3是Hello,Sequence=4是Dave,计算出的StartSequence都是3,分组后数量等于2,返回True。 - 搜索
'Hello Foo':Foo不在表中,MatchingPositions没有数据,返回False。
内容的提问来源于stack exchange,提问作者Mr Giggles
相关产品推荐
相关产品推荐

