regex - 如果列包含名称元素,则选择行,任何顺序

标签 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 列按该顺序恰好包含 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()将文本转换为空格处的数组
  3. 现在您有 2 个可以比较的数组(例如 [john,snow][mr,john,snow] )。 <@比较器检查左侧数组是否完全包含在右侧数组中。


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

关于regex - 如果列包含名称元素,则选择行,任何顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56735355/

相关文章:

mysql - 哪个更好?在 Mysql 查询的 where 子句中定位或喜欢 %

python正则表达式查找并替换具有特定属性值的html标签

regex - Sed 错误 : bad flag in substitute command: 'U'

sql - 加入问题

postgresql - 如何在大事务下获得高性能(postgresql)

ruby-on-rails - Rails PostgreSQL:列 "table_rows"不存在(ActiveRecord::StatementInvalid)

sql-server - 为什么 LIKE 运算符有 ESCAPE 参数?

mysql - SQL使用like运算符在多个字段上查找相同的值

python - 使用 finditer 后如何从正则表达式匹配对象中获取匹配的单词

正则表达式捕获特定单词之间的单词