PostgreSQL 中的字符串匹配

2024-04-29

我需要在 PostgreSQL 8.4 中实现正则表达式(据我理解)匹配。似乎正则表达式匹配仅在 9.0+ 中可用。

我的需求是:

当我给出输入时14.1我需要得到这些结果:

14.1.1
14.1.2
14.1.Z
...

但排除:

14.1.1.1
14.1.1.K
14.1.Z.3.A
...

该模式不限于单个字符。总是有可能出现这样的模式:14.1.1.2K, 14.1.Z.13.A2等等,因为模式是提供给用户的。应用程序无法控制模式(这不是版本号).

知道如何在 Postgres 8.4 中实现这个吗?

再问一个问题后,我的问题就解决了:

在存储过程中的 Postgres 8.4 中转义 LIKE 模式或正则表达式字符串 https://stackoverflow.com/questions/29411869/escaping-a-like-pattern-or-regexp-string-in-postgres-8-4-inside-a-stored-procedu


正则表达式匹配 https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-REGEXP几乎从 7.1 版开始就一直存在于 Postgres 中。使用这些运营商 https://www.postgresql.org/docs/current/functions-matching.html#FUNCTIONS-POSIX-TABLE:

~ !~ ~* !~*

有关概述,请参阅:

  • PostgreSQL 中使用 LIKE、SIMILAR TO 或正则表达式进行模式匹配 https://dba.stackexchange.com/q/10694/3684

你的情况的要点似乎是不允许更多的点:

SELECT *
FROM   tbl
WHERE  version LIKE '14.1.%'        -- for performance
AND    version ~ '^14\.1\.[^.]+$';  -- for correct result

db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!17/0a28f/420

The LIKE表达式是多余的,但即使没有索引,它也会显着提高性能。当然,你应该有一个索引。

The LIKE表达式可以使用基本的text_pattern_ops索引,而正则表达式不能,至少在 Postgres 8.4 中是这样。
或者从 Postgres 9.1 开始使用 COLLATE "C"。看:

  • text_pattern_ops 和 COLLATE "C" 之间有区别吗? https://dba.stackexchange.com/a/291250/3684
  • PostgreSQL LIKE 查询性能变化 https://stackoverflow.com/questions/1566717/postgresql-like-query-performance-variations/13452528#13452528

[^.]正则表达式模式中的字符类不包括点 (.)。所以允许更多的字符,只是不再有点。

表现

要为这个特定查询挤出最佳性能,您可以添加一个专门的索引:

CREATE INDEX tbl_special_idx ON tbl
((length(version) - length(replace(version, '.', ''))), version text_pattern_ops);

并使用匹配查询,与上面相同,只需将最后一行替换为:

AND   length(version) - length(replace(version, '.', '')) = 2

db<>fiddle
Old sqlfiddle http://sqlfiddle.com/#!17/8fe99b/1

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PostgreSQL 中的字符串匹配 的相关文章

随机推荐

  • 在 IntelliJ Scala 控制台中运行时如何设置 Spark MemoryStore 大小?

    我正在 Linux 64 Fedora 25 上的 Intellij CE 2017 1 Scala 控制台中将 Spark 代码作为脚本运行 我在开始时设置了 SparkContext import org apache spark Sp
  • Swift 调用静态方法:type(of: self) 与显式类名

    快速地 一个例子func不能打电话static class func无需在方法调用前添加类名前缀 或者你可以使用type of self e g class Foo static func doIt func callIt Foo doIt
  • 获取 png 图像的像素的 alpha 值?

    我正在使用以下代码 img imagecreatefrompng image png col imagecolorat img x y alpha col gt gt 24 0x7F 但 alpha 值始终为 127 即使像素位于 x y
  • jQuery Draggable + Sortable - 如何在两个可滚动列表之间拖放

    我想要两个列表 可用项目和选定项目 其中可用项目通过拖放分配给选定项目 我要求所选项目可排序 但不要求可用项目可排序 挑战在于这两个列表都可能包含大量项目 因此需要可滚动 这是我迄今为止的 jQuery
  • 为什么不能使用 String.Empty 作为默认参数值?

    今天我在构造函数中创建默认参数值 public SomeClass String something String Empty 编译器抱怨道 something 的默认参数值必须是编译时的 持续的 我的印象是 String 类上的 Empt
  • Node.js 管道化 HTTP 客户端代理?

    Node js 中内置的 HTTP 客户端似乎不支持管道请求 https stackoverflow com a 5776649 362536 然而 我突然想到 也许可以创建一个Agent https nodejs org api http
  • Python:计算非整数的阶乘

    我想知道是否有一种快速的 Pythonic 的方法来计算非整数的阶乘 例如 3 4 当然 内置的factorial 函数在Math模块可用 但它仅适用于积分 我不关心这里的负数 你想用math gamma x http docs pytho
  • 当无法处理指定的情况时,在 switch 语句中抛出异常

    假设我们有一个函数可以在 MVC 应用程序的系统中更改用户的密码 public JsonResult ChangePassword string username string currentPassword string newPassw
  • 如何使用 jquery 迭代多个选择选项

    我只是想知道是否可以通过多个选择选项并获取它们的值和文本 如果选择一个 则获取值和文本 如果选择 2 则获取它们的值和文本 依此类推 我在一页中有 15 个选择框 任何帮助 将不胜感激
  • 分层数据库模型

    我正在设计一个关于宠物的分类网站 该网站将包含 3 个 主要 类别的广告 A Sale B Breeding C Jobs 我面临的问题是 所有 3 个广告类别都有一些共同点 但也有一些差异 例如 类别 A B 和 C 都有以下共同点 ca
  • QMetaObject::invokeMethod 在以下情况下不起作用:

    从静态类和非主线程调用 简而言之 我有一个类 sapp 它有另一个静态类 tobj 作为静态成员 为了避免静态顺序初始化失败 tobj 在 sapp 的方法中声明 该方法又返回 tobj 实例的指针 我的问题是 tobj 有一个计时器 应该
  • 在VBA中将html转换为纯文本

    我有一个 Excel 工作表 其中的单元格包含 html 如何批量将它们转换为明文 目前有很多无用的标签和样式 我想从头开始写它 但如果我能得到纯文本 那就容易多了 我可以编写一个脚本将 html 转换为 PHP 中的纯文本 所以如果您想不
  • 在 Scala 中使用 Some() 和 Option()

    我一直在与 Scala 中解析 JSON 字符串的函数式方法的概念作斗争 并且在返回 Option something 的情况下碰壁了 我提出了这个问题 https stackoverflow com questions 9289647 a
  • MVC Razor for 循环

    我有这段代码 嵌套在表单帖子内 但我不断收到错误 它缺少结束语 for int i 0 i lt itemsCount i
  • 无法通过Anaconda/jupyter获取MNIST数据库

    Hu guys 我是 python anaconda jupyter numPy panda 等的新手 所以如果这是一个非常愚蠢的问题 请原谅我 我正在尝试使用 anaconda jupyter 获取 MNIST 数据库 但每次我最后都会收
  • Java 中的引用变量里面有什么?

    我们知道对象引用变量保存表示访问对象的方式的位 它不保存对象本身 但保存诸如指针或地址之类的东西 我正在阅读 Head First Java 第 2 版 一书 书中写道 第 3 章第 54 页 在 Java 中我们并不真正知道什么是 在引用
  • 如何在一个 TextBox 中进行算术运算?

    例如我写在TextBox1 4 5 or 3 2 如何让答案出现在同一个文本框中 我尝试了这个 但无论如何它都不起作用 Private Sub Button1 Click sender As Object e As EventArgs Ha
  • 同步 gRPC 客户端同步/异步服务器

    我只是好奇 异步 gRPC 服务器是否支持多个客户端的连接 如果不是 异步的可以吗 以及异步服务器 同步客户端的组合 甚至可能吗 是的 同步 gRPC 支持开箱即用的多个连接客户端 我亲自测试了多达 2000 个同时连接的客户端到一个用 G
  • 从 select2 选定选项获取属性值

    我正在使用 Select2 插件http ivaynberg github io select2 select2 latest html http ivaynberg github io select2 select2 latest htm
  • PostgreSQL 中的字符串匹配

    我需要在 PostgreSQL 8 4 中实现正则表达式 据我理解 匹配 似乎正则表达式匹配仅在 9 0 中可用 我的需求是 当我给出输入时14 1我需要得到这些结果 14 1 1 14 1 2 14 1 Z 但排除 14 1 1 1 14