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 中的字符串匹配 的相关文章

  • ASP.NET MVC 6 中的属性路由正则表达式约束错误

    我添加以下路由属性 HttpGet Route add Route id int inn regex 0 9 incBalance range 0 1 dateSet datetime dateNext datetime public IA
  • PostgreSQL:在所有表字段的长度上创建索引

    我有一张桌子叫profile 我想按照填写最多的内容对它们进行排序 每列都是 JSONB 列或 TEXT 列 我不需要很大程度的确定性 所以通常我会按如下方式订购 SELECT FROM profile ORDER BY LENGTH CO
  • Python 正则表达式从文本中提取域

    我有以下正则表达式 r a zA Z0 9 a zA Z0 9 61 a zA Z0 9 a zA Z 2 6 当我将其应用于文本字符串时 比方说 这是 www website1 com 这是 website2 com 我得到 www we
  • SSIS使用列位置而不是名称导入Excel文档

    我想知道是否可以通过按位置引用列来使用 SSIS 导入 Excel 文档 例如 导入列 A D M AA 等 我问这个问题是因为我需要从第三方加载多个 Excel 文档 每个文档在相应的列中包含相同的数据类型 但每个文档的列名称不同 Tha
  • 增量SQL查询

    我的应用程序有一组固定的 SQL 查询 这些查询以轮询模式运行 每 10 秒一次 由于数据库的大小 gt 100 GB 和设计 超级规范化 我遇到了性能问题 每当数据库上发生更改查询结果的 CRUD 事件时 是否可以对给定查询进行增量更改
  • 递归BBCode解析

    我正在尝试解析脚本中的 BBCode 现在 它可以无缝工作 直到我尝试缩进不仅仅是粗体或下划线的 BBCode 例如剧透 网址 字体大小等 然后它就会搞砸 这是我的代码 function parse bbcode text global d
  • 如何在jOOQ中使用别名

    有人可以指导我如何在 jOOQ 中使用别名吗 我尝试查看 jOOQ 文档 但不清楚 如果可能 请提供示例 Both org jooq Table http www jooq org javadoc latest org jooq Table
  • 如何在 Doctrine 中使用 andWhere 和 orWhere ?

    WHERE a 1 AND b 1 Or b 2 AND c 1 OR c 2 我怎样才能在教义中做到这一点 q gt where a 1 q gt andWhere b 1 q gt orWhere b 2 q gt andWhere c
  • MySQL - 替换列中的字符

    作为一个自学成才的新手 我给自己制造了一个大问题 在将数据插入数据库之前 我将字符串中的撇号 转换为双引号 而不是 MySQL 实际需要的反斜杠和撇号 在我的表增长到超过 200 000 行之前 我认为最好立即纠正此问题 所以我做了一些研究
  • 当函数中的模式匹配采用 &self 或 &mut self 时,如何避免使用 ref 关键字?

    铁锈书称为ref关键词 遗产 https doc rust lang org book ch18 03 pattern syntax html legacy patterns ref and ref mut 因为我想遵循隐含的建议来避免re
  • 查询从 Teradata 时间戳返回特定日期(6)

    我如何从 teradata timestamp 6 字段中搜索特定日期 例如 2013 10 22 sel from table A where date 2013 10 22 我尝试了上面的查询 该查询抛出错误 请帮忙 你可以这样尝试 s
  • 如何使用 WHERE x IN 子句编写PreparedStatement 的SQL?

    我有一个如下所示的查询 SELECT last name first name middle initial FROM names WHERE last name IN smith jones brown 我需要能够对 IN 子句中的列表进
  • 获取下一个ID而不插入行

    在 SQL SQL Server 中是否可以在插入行之前从表中的标识列检索下一个 ID 整数 而无需实际插入行 如果删除了最近的行 则这不一定是最高 ID 加 1 我问这个问题是因为我们偶尔需要用新行更新实时数据库 行的 ID 在我们的代码
  • 使用起始字符串和结束字符串从长字符串中提取子字符串?

    我有这个长字符串 它是一个长的连续字符串 Home address H NO 12 SECTOR 12 GAUTAM BUDH NAGAR NOIDA 121212 UTTAR PRADESH INDIA 911112121212 Last
  • 寻找免费的 GUI 工具来使用 PostgreSQL [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 目前 我正在使用独立的 GUI 工具DbSchema http www dbschema com 设计
  • Postgres 运行缓慢的删除查询

    我们有一个表 其行数刚刚超过 62k 我们正在对其运行一个非常简单的删除查询 需要 45 分钟才能完成 DELETE FROM myTable WHERE createdtime lt 2017 03 07 05 00 00 000 我们尝
  • 如何对主索引重新编号

    我有一个简单的 MySQL 表 主索引 id 不是一一编号的 1 31 35 100 等 我希望它们的编号如 1 2 3 4 请告诉我该怎么做 我还想指出的是 我知道该操作可能产生的后果 但我只是想整理一下表格 我同意其他方法也可以 但我只
  • '用户“postgres”的密码验证失败'

    我已经安装了 PostgreSQL 8 4 Postgres 客户端和 Pgadmin 3 控制台客户端和 Pgadmin 的用户 postgres 身份验证失败 我输入了用户 postgres 和密码 postgres 因为它以前有效 但
  • 正则表达式确保特定单词不会出现在模式中间

    我有一个正则表达式 它匹配列表中的一系列字符 但我想阻止它匹配单词 我的正则表达式是 widget w d w d 我希望它像这样匹配 widget JQYHHU 查看小部件 应该匹配 widget JQYHHU 查看小部件 应该匹配 wi
  • SQL:将一个表中的所有记录插入到另一表中,而不指定列

    我想将备份表 foo bk 中的所有记录插入到 foot 表中 而不指定特定的列 如果我尝试这个查询 INSERT INTO foo SELECT FROM foo bk 我会收到错误 插入错误 列名称或提供的值的数量与表定义不匹配 是否可

随机推荐

  • 在 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