我正在尝试通过links.name列实现一个简单的搜索功能。我想将关键字与名称值进行匹配,并希望在结果顶部获得具有更多匹配项的名称。 我想要/尝试做的是
declare matchings integer := 0
select if "keyword1" ~* name then matchings := matchings + 1 end if
if "keyword2" ~* name then matchings := matchings + 1 end if
... so on for all keywords given ..
as matchings_count from links order by matchings_count;
这样做的正确语法是什么?不必担心性能,因为链接仅包含1200行,并且增加的行数不会超过1500。 任何输入将不胜感激。 预先感谢。
答案 0 :(得分:2)
完成任务的最简单方法是
with t as(
select 'key1' as k
union all select 'key2' as k
union all select 'key3' as k
)
select count(*) from t
where k ~* '(key1)|(key2)'
;
如果您只想计算匹配数
select count(*) from t
where k ~* 'key1'
union all select count(*) from t
where k ~* 'key2'
...
;
答案 1 :(得分:1)
在Postgres中,您可以将布尔值转换为数字并将其加起来:
select l.*,
( ("keyword1" ~* name)::int +
("keyword2" ~* name)::int +
. . .
) as num_matches
from links l
order by num_matches desc;