PostgreSQL:在所有文本列中 ILIKE

PostgreSQL: ILIKE in all text columns

是否有一种简单的临时方法来对 table 的所有文本列执行 ILIKE 查询?

我知道有一个包含“foobar”的单元格。但是 table 有很多列,只有 50k 行,所以搜索所有列和行应该很快。

我给你这个查询是因为你知道这不是你用来提高性能的东西,只是回填和清理(这里似乎就是这种情况):

SELECT * 
FROM tablename foo 
WHERE LOWER(foo::text) LIKE '%foobar%'

如果您想实现一些性能适中的自由文本搜索,您需要努力创建索引 tsvector/weighted tsvector 列。

为了不含糊,可以这样写:

SELECT * 
FROM   tablename foo
WHERE  foo.*::text ILIKE '%foobar%';

同名的嵌套列(在本例中为 foo)将优先。更详细的语法 foo.* 使其成为对 table 行的明确引用。

关于 LIKEILIKE(和索引支持):

  • LOWER LIKE vs iLIKE

密切相关:

为了更有针对性的搜索(未满足“临时”要求),要在搜索中仅包含字符串类型的列,并排除上述可能产生的极端情况误报,您可以使用动态 SQL 沿着这些线:

  • Replace empty strings with null values