【问题标题】:select rows if column contain name elements, any order如果列包含名称元素,则选择行,任何顺序
【发布时间】:2019-06-24 11:12:57
【问题描述】:

我有一个包含几千行的表。这些结果是通过使用名称列表查询 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

【问题讨论】:

    标签: regex postgresql sql-like string-matching


    【解决方案1】:

    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])。 &lt;@ 比较器检查左侧数组是否完整包含在右侧数组中。


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

    【讨论】:

    • 非常感谢!它完美地完成了这项工作,我了解了如何以及为什么。再次感谢。
    猜你喜欢
    • 2013-11-02
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多