如果列包含名称元素,则以任意顺序选择行

时间:2019-06-24 11:12:57

标签: regex postgresql sql-like string-matching

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

对于“ John Snow”的搜索,api将返回其数据库中包含令牌“ john”和令牌“ snow”的所有条目。所以我有很多误报。

我想做的就是对表进行子集化,这样我就只有记录title列(包含与搜索字符串匹配的字符串的列)包含搜索字符串的所有元素的记录, 与订单无关

我尝试了

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

1 个答案:

答案 0 :(得分:2)

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()将文本转换为空格处的数组
  3. 现在您可以比较2个数组(例如[john,snow][mr,john,snow])。 <@比较器检查右数组包含的左数组是否完整。


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