我使用的是PostgreSQL 11

我想做和高级搜索.

我的目标是判断我的文本中的所有单词是否都存在于原始文本中

这是原文

"dumas, franshesco robert Ferrer Lombardy alive"

这是搜索的可能性:

"franshesco robert alive"返回ok

"franshesco robert Ferrer Viran" not ok因为Viran在原文中不存在

"dumas franshesco , robert",ok.

"alive dumas ! franshesco",ok.

"alive dumas ! suzan franshesco "不可以,因为suzan在原始文本中不存在

因此,这意味着当搜索首先使用空格分割文本并排除像(,!?.)这样的特殊字符时

然后判断所有这些词是否都存在于原文"dumas, franshesco robert Ferrer Lombardy alive"个中

for example to search this "alive dumas ! franshesco"
in the original text "dumas, franshesco robert Ferrer Lombardy alive"

首先拆分文本并排除特殊字符

所以把这个单词alivedumasfranshesco

然后判断这些单词在原文中是否都存在.

我使用以下代码:

select  string_to_array(regexp_replace('alive dumas ! franshesco',  '[^\w]+',' ','g'), ' ') as val_arr

为了将字符串拆分成单词并删除特殊字符

结果是"{alive,dumas,franshesco}"

现在我想要找到一种方法来判断所有这些单词是否都存在于这个字符串中

"dumas, franshesco robert Ferrer Lombardy alive"

有人能帮我找到正确的查询吗

推荐答案

您希望表中的所有行的文本仅包含参数字符串中的单词.您已经有了将字符串转换为单词数组的逻辑,所以我们可以在此基础上进行构建;array containment operator <@在这里很方便.

假设短语存储在mytable中的列txt下:

select *
from mytable 
where  string_to_array(regexp_replace(txt,  '[^\w]+',' ','g'), ' ') ) 
    <@ string_to_array(regexp_replace('alive dumas ! franshesco',  '[^\w]+',' ','g'), ' ')

Sql相关问答推荐

如何返回字符串中包含相同值的数据?

如何查询未命名对象的SON数组

Postgresql在加入时显示重复的行

有没有办法用SQL编写一条CASE语句,如果列A&>0,那么列B,列C=0

计算周时出现SQL错误结果

替换上一个或下一个值中的空值并添加其价格日期

如何计算一个用户S的日常连胜?

过go 四周未填充的数据,即W50,51,52-SQL

需要从键-值对数据中提取值

删除所有订单中可用的重复值

如何根据创建日期查找两个表中最接近的记录?

snowflake中的动态文件名生成

根据开始时间和结束时间计算has_impact字段

Postgresql 需要一个查询,为我提供所有没有具有特定状态值的子元素的父母

雅典娜弄错了操作顺序

存储过程 - 动态 SQL 中不同列值的计数

如何在 RavenDB Studio (RQL) 中插入更新文档

如何在 Oracle 中获取此变量的值?

在时态表和非时态表之间使用 EXCEPT 的 SQL 子查询给出表达式错误数

Postgres 窗口函数未按预期工作