这里有两种方法可以首先返回包含独立单词“ball”的所有行,然后是在另一个单词中包含“ball”的行。
首先,如果您想确保首先出现只有“球”的行,请在您的排序中构建一个案例表达式。
在此检查值是否等于您的搜索变量。如果它确实映射到一个数字,例如一。如果它没有映射到更高的数字,例如两个。
要返回所有包含 ball 作为它自己的单词的行,有两种方法:
regexp_like
可以使用正则表达式:
(^|\s|\W)球($|\s|\W)
SQL 中的样子:
create table t as
select 0 id, 'ball' val from dual union
select 1, 'basketball' from dual union
select 2, 'ballpen' from dual union
select 3, 'a ball' from dual union
select 4, 'ball pen' from dual union
select 5, 'littlefoot' from dual;
var v varchar2(10);
exec :v := 'ball';
select *
from t
where val like '%' || :v || '%'
order by case
when val = :v then 1
when regexp_like ( val, '(^|\s|\W)' || :v || '($|\s|\W)' ) then 2
else 3
end, id;
ID VAL
0 ball
3 a ball
4 ball pen
1 basketball
2 ballpen
Oracle 文本
如果在列上创建 Oracle Text 索引,则可以使用 contains 来查找匹配的行。调用这个两次。一次找到完全匹配。然后再次显示与单词匹配的内容。
然后按照这些降序的分数进行排序。先是准确的分数,然后是另一个:
create index test_i on t ( val ) indextype is ctxsys.context;
select t.*, score (1), score (2) from t
where contains ( val, :v, 1 ) > 0
or contains ( val, '%' || :v || '%', 2 ) > 0
order by case
when val = :v then 1
else 2
end, score ( 1 ) desc, score ( 2 ) desc;
ID VAL SCORE(1) SCORE(2)
0 ball 4 4
3 a ball 4 4
4 ball pen 4 4
1 basketball 0 4
2 ballpen 0 4