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 行的明确引用。
关于 LIKE
与 ILIKE
(和索引支持):
- LOWER LIKE vs iLIKE
密切相关:
为了更有针对性的搜索(未满足“临时”要求),要在搜索中仅包含字符串类型的列,并排除上述可能产生的极端情况误报,您可以使用动态 SQL 沿着这些线:
- Replace empty strings with null values
是否有一种简单的临时方法来对 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 行的明确引用。
关于 LIKE
与 ILIKE
(和索引支持):
- LOWER LIKE vs iLIKE
密切相关:
为了更有针对性的搜索(未满足“临时”要求),要在搜索中仅包含字符串类型的列,并排除上述可能产生的极端情况误报,您可以使用动态 SQL 沿着这些线:
- Replace empty strings with null values