SQL中可以使用LIKE实现模式匹配,以%作为通配符语法:
(1)'keywords%'以keywords开头
(2)'%keywords'以keywords结尾
(3)'%keywords%'任意位置含有keywords
遇到一个需求,不但要找出模式匹配的子集合,还有知道是哪一种匹配,从头开始?尾部匹配?中间匹配?
使用场景是Android Provider封装了对于数据库的操作,直接返回Cursor。当然,可以在使用Cursor的时候在Java中做二次判断,但这样做架构上不够优美,直接在数据库做计算(SQL层),以增加一个字段的方式封装在Cursor中直接返回,我认为比较好,一来架构清楚,逻辑耦合度低,二来这部分计算可以充分借助数据库的性能优化。研究了一下SQL的语法,最后用类似这样的SQL code完成:
select colA,
(case
when colA like 'keywords%' then 'start'
when colA like '%keywords' then 'end'
else 'middle'
end)
as match_type
from yourtable
where colA like '%keywords%';
这样的语法支持Text和Integer,上面code即Text,Integer类似:
select colA,
(case
when colA like 'keywords%' then 90
when colA like '%keywords' then 80
else 60
end)
as match_score
from yourtable
where colA like '%keywords%';