SQL Server中精准匹配特定子字符串的SQL查询方法求助
解决SQL Server中精准匹配分隔子串的问题
针对你需要在点分隔的字符串列中精准匹配完整子串的需求,这里提供几种可行的方案:
方法1:使用STRING_SPLIT分割字符串(SQL Server 2016+)
这种方法直观易懂,将reference列按点分割为多个片段,直接筛选包含完全匹配目标子串的行:
DECLARE @target VARCHAR(50) = 'VB1234'; -- 替换为你要查询的子串 SELECT DISTINCT t.* FROM your_table t CROSS APPLY STRING_SPLIT(t.reference, '.') s WHERE s.value = @target;
说明:
STRING_SPLIT会把每个reference值按.拆分成独立的片段- 通过
CROSS APPLY将拆分后的片段和原表行关联 DISTINCT确保同一行不会因为多个匹配片段重复返回- 替换
@target为VB8455时,会自动匹配第3、4条记录
方法2:使用LIKE多模式匹配
如果你的SQL Server版本不支持STRING_SPLIT,可以通过组合LIKE的三种匹配场景来覆盖所有可能的子串位置:
DECLARE @target VARCHAR(50) = 'VB1234'; SELECT * FROM your_table WHERE -- 场景1:子串在开头(下划线之后,点之前) reference LIKE '_' + @target + '.%' -- 场景2:子串在中间(前后都是点) OR reference LIKE '%.' + @target + '.%' -- 场景3:子串在结尾(点之后到字符串末尾) OR reference LIKE '%.' + @target;
说明:
- 针对你的示例数据:
- 查询
VB1234时,第2条符合场景1,第4条符合场景3,会被返回 - 查询
VB8455时,第3条符合场景3,第4条符合场景1,会被返回
- 查询
- 这种方法不需要额外函数,兼容性更好
方法3:使用正则表达式匹配(SQL Server 2017+)
利用REGEXP_LIKE函数,通过正则规则匹配完整的分隔片段:
DECLARE @target VARCHAR(50) = 'VB1234'; SELECT * FROM your_table WHERE REGEXP_LIKE(reference, N'(^_|[.])' + @target + N'([.]|$)');
说明:
- 正则表达式
(^_|[.])表示子串的前缀是开头的下划线或者点 ([.]|$)表示子串的后缀是点或者字符串结尾- 这样能确保匹配的是完整的分隔片段,不会出现部分匹配的情况
内容的提问来源于stack exchange,提问作者megabytes
相关产品推荐
相关产品推荐

