项目里有一个新的需求,在检索处原先只有根据各个字段的模糊查询,按照我项目中的例子是 中文名,英文名以及负责人。那么有时候在匹配的字段很多的情况下,如果只输入’ms’(数据库中刚好有这样的英文名) 这个正好匹配的字段原则上要显示在第一列,或者说匹配程度越好的要显示在越前面,而不仅仅是一连串的返回匹配到的结果而已。查询结果有10多页,那个提需求的老哥 我能感受到他找这条数据的痛苦。。。
case 表达式
那么言归正传,主要就是对order by部分进行匹配度的计算,这里需要用到 case when 表达式 因为我需要匹配好几个字段。
在case 里面可以有多个when then else的三元表达式
匹配度的计算
这里首先将字段中我们待查询的子串变为空字符串,然后比较剩余字符串长度 与原来字符串长度的比值
length(REPLACE(cn.cn_name,‘ms’,’’))/length(cn.cn_name)
比如说 abcms 在经历 替换以后 变成 abc 比值为 3/5
以及 amsdsms 在经历 替换以后 变成 ads 比值为 3/7
可以发现如果结果越小,表示被替换的值就越多,也就是匹配度越高,那么按照order by的升序排列,就会在越前面被显示出来
SQL语句
select cn.cn_name,