我正在使用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有没有办法做到这一点?
答案 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
搜索字符串。