select 行如果列包含名称元素,任何顺序

select rows if column contain name elements, any order

我有一个包含几千行的 table。这些结果是通过使用名称列表查询 api 产生的。

为了搜索 "John Snow",api 将 return 其数据库中包含令牌 "john" 和令牌 "snow" 的所有条目。所以我有很多误报。

我想做的是对 table 进行子集化,这样我只有 title 列(包含与我的搜索字符串匹配的字符串的列)包含 ALL 的记录搜索字符串的元素,不管顺序如何

我试过了

select * from table where 'john snow' ~* title;

select * from table where 'john snow' ILIKE '%' || title || '%';

两者都有效,但前提是 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

demo:db<>fiddle

SELECT
    *
FROM
    my_table
WHERE
    regexp_split_to_array(lower('john snow'), ' ') 
        <@ regexp_split_to_array(lower(title), ' ')
  1. lower() 标准化大写字母
  2. regexp_split_to_array() 将文本转换为 space
  3. 处的数组
  4. 现在您有 2 个可以比较的数组(例如 [john,snow][mr,john,snow])。 <@ 比较器检查左侧数组是否完整包含在右侧数组中。


免责声明:在非常大的桌子上,这可能会很慢。在这种情况下,我建议您查看全文搜索引擎:https://www.postgresql.org/docs/current/textsearch.html