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

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;

逻辑解释

  1. SplitSequence CTE:使用STRING_SPLIT把输入的搜索字符串按空格拆分,给每个单词分配一个序号(SeqNum),代表它在目标序列中的位置。
  2. MatchingPositions CTE:将原表中的单词和拆分后的单词匹配(先处理Text字段的空格问题),然后计算每个匹配项对应的"起始Sequence"——比如如果这个单词是目标序列的第2个,那么起始Sequence就是当前Sequence减1(2-1=1)。
  3. 最后通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:43:51