查询 Postgresql 数据库以验证单词顺序

Query Postgresql database to validate words order

假设您在一列中有一个字符串,例如 'The quick brown dog jumped over the lazy fox'。如何查询字符串中是否存在两个单词,但顺序特定?

例如,如果我想按特定顺序检索包含 foxdog 的所有记录。如果我们有以下字符串,我们应该只得到第二条记录,而不是第一条记录:

The quick brown dog jumped over the lazy fox (should not be retrieved)
The quick brown fox jumped over the lazy dog (retrieved due to order)

常规查询不会保持先搜索 fox 再搜索 dog 的顺序:

SELECT d.text
from docs d
where lower(d.text) ~ '\yfox\y' and
      lower(d.text) ~ '\ydog\y'

如何保持查询词的优先级?本来想用lookahead或者lookbehind,但是这个词可以相隔好几个词。

谢谢

如果您不关心单词边界,您可以简单地使用 like

where d.text like '%fox%dog%'

或使用正则表达式:

where d.text *~ '\yfox(\y.*\y|\y)dog\y'

您可以使用

where d.text ~* '\yfox\y.*\ydog\y'

详情

  • \yfox\y - 一个完整的单词 fox\y 相当于 PCRE 和最常见的 NFA 正则表达式引擎中的 \b,您可以在许多在线正则表达式测试人员)
  • .* - 尽可能多的任意 0 个或更多字符
  • \ydog\y - 一个完整的单词 dog.

~* operator 启用不区分大小写的匹配。