表如下:
SELECT * FROM “table1” where name like ‘% 玉米 %’
很明显这个会返回所有的行,因为每行都满足条件
若我想在模糊查询后,进行排序,完全匹配的放在最前面,其余的放后面,可以使用 case when then
如:
SELECT * FROM “table1” WHERE name LIKE ‘% 玉米 %’
ORDER BY (
CASE
WHEN name=’玉米’ THEN 1
WHEN name like ‘玉米 %’ THEN 2
WHEN name like ‘% 玉米 %’ THEN 3
WHEN name like ‘% 玉米’ THEN 4
ELSE 5
END
)
顺序是:完全匹配 > 开头匹配 > 中间匹配 > 最后匹配
else 后面的数字代表剩余的情况则按 ELSE 后的数字顺序排,5>4, 所以剩余的情况会排在最后
查询结果如图:
假设表里有多个字段,同时模糊查询多个字段,但是字段之间也有优先级排序,
比如 name>nickname>code,然后再按完全匹配 > 开头匹配 > 中间匹配 > 最后匹配的顺序排
表如下:
那么我可以这样,sql 语句如下:
SELECT * FROM “table1” WHERE name LIKE ‘%yumi%’
OR nickname LIKE ‘%yumi%’
OR code LIKE ‘%yumi%’
ORDER BY (
CASE
WHEN name=’yumi’ THEN 1
WHEN name like ‘yumi%’ THEN 2
WHEN name like ‘%yumi%’ THEN 3
WHEN name like ‘%yumi’ THEN 4
WHEN nickname=’yumi’ THEN 5
WHEN nickname like ‘yumi%’ THEN 6
WHEN nickname like ‘%yumi%’ THEN 7
WHEN nickname like ‘%yumi’ THEN 8
WHEN code=’yumi’ THEN 9
WHEN code like ‘yumi%’ THEN 10
WHEN code like ‘%yumi%’ THEN 11
WHEN code like ‘%yumi’ THEN 12
ELSE 13
END
)
如图:
这个表格的数据不是十分贴切,但是大致是这样意思