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

SQL实现:筛选名称列与指定参数有至少2个匹配分词的人员ID

多分词匹配数≥2的SQL实现方案

核心逻辑说明

之前尝试交叉连接+子串统计的方案常见的两个问题:

  • 没有对人员name列做独立分词拆分,无法实现逐词精准匹配,容易出现子串误判
  • 统计逻辑未对齐:需要统计的是两个独立分词集合的交集规模,不是单字段内的子串出现频次

可直接运行的实现代码

declare @name_to_search_for nvarchar(200) = 'Paul Smith Parsons'
-- 拆分搜索参数的有效分词,过滤空值、去重
WITH search_terms AS (
    SELECT DISTINCT LTRIM(RTRIM(value)) AS term
    FROM STRING_SPLIT(@name_to_search_for, ' ')
    WHERE LTRIM(RTRIM(value)) <> ''
),
-- 拆分每条人员记录name的有效分词
person_terms AS (
    SELECT 
        p.id,
        LTRIM(RTRIM(s.value)) AS person_term
    FROM #persons p
    CROSS APPLY STRING_SPLIT(p.[name], ' ') s
    WHERE LTRIM(RTRIM(s.value)) <> ''
)
-- 关联匹配后按人分组统计匹配数,筛选符合条件的记录
SELECT pt.id
FROM person_terms pt
INNER JOIN search_terms st 
    ON pt.person_term = st.term
GROUP BY pt.id
HAVING COUNT(*) >= 2
ORDER BY pt.id

结果验证

对照测试表数据,代码的匹配计数完全符合预期:

  • id=1:仅匹配Paul,计数1,不满足
  • id=2:匹配Paul、Smith,计数2,满足
  • id=3:匹配Paul、Parsons,计数2,满足
  • id=4:仅匹配Smith,计数1,不满足
  • id=5:仅匹配Paul,计数1,不满足
  • id=6:匹配Parsons、Smith,计数2,满足

最终输出结果为2、3、6,与预期完全一致。

常见踩坑提示

  • 避免使用LIKE '%关键词%'做匹配,会出现子串误判(比如关键词Paul会误匹配名字中的Paula、Paulson),上述实现采用整词完全相等匹配,精度更高
  • 分词拆分后必须做前后空格裁剪、空值过滤,避免连续空格拆分出无效空分词导致统计偏差
  • 拆分搜索词时加DISTINCT处理,避免搜索参数本身存在重复词时导致的计数虚高
  • 上述实现依赖SQL Server 2016及以上版本内置的STRING_SPLIT函数,低版本环境可使用自定义拆分函数替代,整体分词关联、分组统计的逻辑不变

内容的提问来源于stack exchange,提问作者Beaker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.29 23:27:02