Postgres:结果行上的全文过滤器

时间:2014-03-18 11:05:36

标签: sql postgresql

我正在使用jTable来提供一个说客户表。此表支持对各种条件进行过滤,对结果进行排序以及分页。

所有这些都反映在Postgres查询中以获取数据:

SELECT
  ...some columns...
FROM
  ...some table...
WHERE
  ...filter conditions...
ORDER BY
  ...sort order...
OFFSET offset LIMIT limit;

现在桌子应该可以做一个"全文" search,含义:如果未在结果行的任何列中找到搜索词作为子字符串,则不允许此行。

我的第一种方法是将每一行渲染为JSON(如jTable所要求的那样),然后执行String.contains(),但这对于其余的过滤/排序/分页效果不佳。

我想要的是一种检查该术语是否包含在查询结果行中的方法,我希望它成为查询的一部分。我不想明确检查每个列:... AND (col1 LIKE '%term%' OR col2 LIKE '%term%' OR ...

在Postgres有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以将所有列连接成一个字符串,然后执行搜索:

SELECT ...some columns...
FROM (SELECT ...some columns...,
             concat_ws(, '|', ...some columns...) as tosearch
      FROM ...some table...
      WHERE ...filter conditions...
      ORDER BY...sort order...
      OFFSET offset LIMIT limit
     ) t
WHERE tosearch like '%searchterm%';

注意:concat_ws()会忽略NULL,因此您不必担心NULL搜索字符串。