【问题标题】:Query Postgresql database to validate words order查询 Postgresql 数据库以验证单词顺序
【发布时间】:2020-11-14 05:02:04
【问题描述】:

假设您在列中有一个字符串,例如“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,但这个词可以是多个词彼此分开。

谢谢

【问题讨论】:

    标签: sql postgresql regex-lookarounds


    【解决方案1】:

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

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

    或使用正则表达式:

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

    【讨论】:

      【解决方案2】:

      你可以使用

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

      详情

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-24
        • 2015-02-25
        • 1970-01-01
        • 2022-01-20
        • 2013-02-19
        相关资源
        最近更新 更多