PostgreSQL有条件地为每一行生成值

时间:2019-06-22 03:36:43

标签: sql postgresql

我正在尝试通过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。 任何输入将不胜感激。 预先感谢。

2 个答案:

答案 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)'
;

sqlfiddle

如果您只想计算匹配数

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;