我有一个包含几千行的表格。这些结果是通过使用名称列表查询 api 生成的。
对于“John Snow”的搜索,api 将返回其数据库中包含标记“john”和标记“snow”的所有条目。所以我有很多误报。
我想做的是对我的表进行子集化,以便我只有 title
列(包含与我的搜索字符串匹配的字符串的列)包含的所有元素的记录搜索字符串,不考虑顺序。
我试过了
select * from table where 'john snow' ~* title;
select * from table where 'john snow' ILIKE '%' ||标题 || '%';
两者都有效,但前提是 title
列按该顺序恰好包含 john snow
。
之前
str_searched | title
-------------+-------
john snow | snow white
john snow | john wick
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
之后
str_searched | title
-------------+-------
john snow | SNOW john
john snow | john Snow
john snow | Mr john snow
最佳答案
SELECT
*
FROM
my_table
WHERE
regexp_split_to_array(lower('john snow'), ' ')
<@ regexp_split_to_array(lower(title), ' ')
-
lower()
标准化大写字母 -
regexp_split_to_array()
将文本转换为空格处的数组 - 现在您有 2 个可以比较的数组(例如
[john,snow]
和[mr,john,snow]
)。<@
比较器检查左侧数组是否完全包含在右侧数组中。
免责声明:在非常大的 table 上,这可能会很慢。在这种情况下,我建议您查看全文搜索引擎:https://www.postgresql.org/docs/current/textsearch.html
关于regex - 如果列包含名称元素,则选择行,任何顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735355/