SQL如何实现列中模式与字符串的反向匹配查询?
解决方案思路与实现
你的需求核心是按优先级匹配通配符规则,SQL里可以通过LIKE运算符配合排序来实现,步骤如下:
- 转换通配符:SQL标准中
LIKE用%表示任意长度字符(对应你的*),所以先把表中的Filter字段里的*替换成%。 - 匹配筛选:用目标字符串去匹配转换后的规则。
- 优先级排序:给不同规则设置优先级,确保最精确的规则(比如
foo*)排在最前面,最后取第一个匹配结果。
具体SQL实现(以MySQL为例)
假设要匹配的目标字符串是'fooString',执行以下查询会返回ID=1:
SELECT ID FROM FILTER_TABLE WHERE 'fooString' LIKE REPLACE(Filter, '*', '%') ORDER BY CASE Filter WHEN 'foo*' THEN 1 WHEN '*bar' THEN 2 WHEN '*' THEN 3 END LIMIT 1;
适配不同数据库
- SQL Server 替换
LIMIT 1为TOP 1:
SELECT TOP 1 ID FROM FILTER_TABLE WHERE 'fooString' LIKE REPLACE(Filter, '*', '%') ORDER BY CASE Filter WHEN 'foo*' THEN 1 WHEN '*bar' THEN 2 WHEN '*' THEN 3 END;
- PostgreSQL 用法和MySQL一致,用
LIMIT 1即可。
逻辑说明
- 当目标字符串是
'xyzbar'时,会匹配*bar和*两条规则,但排序后*bar优先级更高(排序值2),所以返回ID=2。 - 当目标字符串不匹配前两条规则时,只会匹配
*,返回ID=3。 - 如果后续要添加更多规则,只需要在
CASE语句中增加对应的规则和优先级数值即可(数值越小优先级越高)。
内容的提问来源于stack exchange,提问作者Giuseppe Ventura
相关产品推荐
相关产品推荐

