PostgreSql 字符串匹配

一、概述

  PostgreSQL 提供了三种独立的实现模式匹配的方法:SQL LIKE 操作符、更近一些的 SIMILAR TO 操作符(SQL:1999 里添加进来的)和 POSIX 正则表达式。虽然大部分的正则表达式搜索都能被很快地执行,但是正则表达式仍可能被人为地设置成需要任意长的时间和任意量的内存进行处理,如果必须这样做,建议加上语句超时限制。使用 SIMILAR TO 模式的搜索具有同样的安全性危险,LIKE 搜索比其他两种选项简单得多,要更安全些。

二、SQL LIKE 操作符

2.1 语法

string LIKE pattern [ESCAPE escape-character]
string NOT LIKE pattern [ESCAPE escape-character]

参数说明

string:待匹配的字符串。
pattern:匹配规则。若不包含百分号或者下划线,那么只匹配串本身,这时 LIKE 的行为等价于等号操作符,下划线(_)代表匹配任何单个字符,百分号(%)匹配任何零或更多个字符。
ESCAPE:自定义转义字符,默认为反斜线(\)。

补充
PostgreSQL 还提供了标准 SQ L中没有的 ILIKE 操作符,用于忽略大小写的模式匹配。

~~:等效于 LIKE。
~~*:等效于 ILIKE。
!~~:等效于 NOT LIKE。
!~~*:操作符 NOT ILIKE。

2.2 示例

--正常字符匹配
postgres=# select * from t;id |   name
----+----------1 | XIAOH2 | XIAOO3 | xiaoguo4 | xiaowan5 | xiaopiao6 | xiaopen
(6 rows)postgres=# select * from t where name like 'xiao%';id |   name
----+----------3 | xiaoguo4 | xiaowan5 | xiaopiao6 | xiaopen
(4 rows)postgres=# select * from t where name ~~ 'xiao%';id |   name
----+----------3 | xiaoguo4 | xiaowan5 | xiaopiao6 | xiaopen
(4 rows)postgres=# select * from t where name not like 'xiao%';id | name
----+-------1 | XIAOH2 | XIAOO
(2 rows)postgres=# select * from t where name !~~ 'xiao%';id | name
----+-------1 | XIAOH2 | XIAOO
(2 rows)postgres=# select * from t where name ilike 'xiao%';id |   name
----+----------1 | XIAOH2 | XIAOO3 | xiaoguo4 | xiaowan5 | xiaopiao6 | xiaopen
(6 rows)postgres=# select * from t where name ~~* 'xiao%';id |   name
----+----------1 | XIAOH2 | XIAOO3 | xiaoguo4 | xiaowan5 | xiaopiao6 | xiaopen
(6 rows)postgres=# select * from t where name not ilike 'xiao%';id | name
----+------
(0 rows)postgres=# select * from t where name !~~* 'xiao%';id | name
----+------
(0 rows)--加转义匹配
postgres=# select * from t;id | name
----+------1 | \2 | \n3 | \\4 | a\a
(4 rows)postgres=# select * from t where name like '\%';id | name
----+------
(0 rows)postgres=# select * from t where name like '\\%';id | name
----+------1 | \2 | \n3 | \\
(3 rows)postgres=# select * from t where name like '3\%' escape '3';id | name
----+------1 | \2 | \n3 | \\
(3 rows)postgres=# select * from t where name like '#\%' escape '#';id | name
----+------1 | \2 | \n3 | \\
(3 rows)postgres=# select * from t where name like '@\%' escape '@';id | name
----+------1 | \2 | \n3 | \\
(3 rows)

三、SIMILAR TO 操作符

3.1 语法

string SIMILAR TO pattern [ESCAPE escape-character]
string NOT SIMILAR TO pattern [ESCAPE escape-character]

参数说明

string:待匹配的字符串。
pattern:匹配规则。若不包含百分号或者下划线,那么只匹配串本身,这时 LIKE 的行为等价于等号操作符,下划线(_)代表匹配任何单个字符,百分号(%)匹配任何零或更多个字符。
ESCAPE:自定义转义字符,默认为反斜线(\)。

除了支持上述 LIKE 的语法外,SIMILAR TO 还支持 POSIX 正则表达式匹配元字符:

|:表示选择(两个候选之一)。
*:表示重复前面的项零次或更多次。
+:表示重复前面的项一次或更多次。
?:表示重复前面的项零次或一次。
{m}:表示重复前面的项刚好m次。
{m,}:表示重复前面的项m次或更多次。
{m,n}:表示重复前面的项至少m次并且不超过n次。

可以使用圆括号()把多个项组合成一个逻辑项。一个方括号表达式[…]声明一个字符类,就像 POSIX 正则表达式一样。

3.2 示例

postgres=# select * from t;id |           name
----+--------------------------1 | ab2 | cdcdcdcdcdcdcdcdcdcdcdcd3 | efghefghefghefgh
(3 rows)postgres=# select * from t where name similar to 'c%';id |           name
----+--------------------------2 | cdcdcdcdcdcdcdcdcdcdcdcd
(1 row)postgres=# select * from t where name similar to '(a|c)%';id |           name
----+--------------------------1 | ab2 | cdcdcdcdcdcdcdcdcdcdcdcd
(2 rows)postgres=# select * from t where name similar to '(cd)*';id |           name
----+--------------------------2 | cdcdcdcdcdcdcdcdcdcdcdcd
(1 row)postgres=# select * from t where name similar to '(cd)+';id |           name
----+--------------------------2 | cdcdcdcdcdcdcdcdcdcdcdcd
(1 row)postgres=# select * from t where name similar to '(ab)?';id | name
----+------1 | ab
(1 row)postgres=# select * from t where name similar to '(efghefgh){2}';id |       name
----+------------------3 | efghefghefghefgh
(1 row)postgres=# select * from t where name similar to '(efgh){2,}';id |       name
----+------------------3 | efghefghefghefgh
(1 row)

四、POSIX 正则表达式

4.1 匹配操作符

操作符描述例子
text ~ text → boolean字符串匹配正则表达式,大小写敏感‘thomas’ ~ ‘.*thom.*’ → t
text ~* text → boolean字符串匹配正则表达式,大小写不敏感‘thomas’ ~* ‘.*Thom.*’ → t
text !~ text → boolean字符串不匹配正则表达式,大小写敏感‘thomas’ !~ ‘.*thomas.*’ → f
text !~* text → boolean字符串不匹配正则表达式,大小写不敏感‘thomas’ !~* ‘.*Thom.*’ → f

4.2 常用匹配规则

匹配规则符描述
|选择(两个候选之一)
*重复前面的项零次或更多次
+重复前面的项一次或更多次
()括号中内容一个逻辑项
?前面的项零次或一次
*?*的非贪婪模式
+?+的非贪婪模式
???的非贪婪模式
{m}重复前面的项刚好m次
{m,}重复前面的项m次或更多次
{m,n}重复前面的项至少m次并且不超过n次
{m}?{m}的非贪婪模式
{m,}?{m,}的非贪婪模式
{m,n}{m,n}的非贪婪模式
^匹配字串的开头
$匹配字串的结尾
\n匹配换行
\r匹配回车
\t匹配制表符
\d匹配任意数字
\s匹配空格
\w匹配任意字母
\D匹配非数字
\S匹配非空格
\W匹配非字母
[a-z]匹配任意小写字母
[A-Z]匹配任意大写字母
[^a-z]匹配非小写字母
[^A-Z]匹配非大写字母
[0-9]匹配任意数字
[^0-9]匹配非数字
[abc]匹配a或b或c或ab或ac或bc
[a]+匹配一个a或多个a

4.2 常用相关函数

--substring 函数匹配字符串
postgres=# select substring('foobar',3);substring
-----------obar
(1 row)postgres=# select substring('foobar',3,2);substring
-----------ob
(1 row)postgres=# select substring('foobar' from '..$');substring
-----------ar--regexp_replace 函数替换字符串
postgres=# select regexp_replace('foobar','o','x');regexp_replace
----------------fxobar
(1 row)postgres=# select regexp_replace('foobar','o','x','g');regexp_replace
----------------fxxbar
(1 row)postgres=# select regexp_replace('foobar','b..','x');regexp_replace
----------------foox--regexp_match 函数匹配返回文本数组
postgres=# select regexp_match('foobar','..b');regexp_match
--------------{oob}
(1 row)postgres=# select regexp_match('foobar','(f)(..b)');regexp_match
--------------{f,oob}
(1 row)--regexp_matches 函数匹配返回文本数组的集合
postgres=# select regexp_matches('foobarbequebazilbarfbonk','b[^b]+','g');regexp_matches
----------------{bar}{beque}{bazil}{barf}{bonk}
(5 rows)--regexp_split_to_table 函数把一个 POSIX 正则表达式模式当作一个定界符来分离一个串
postgres=#  select regexp_split_to_table('shi yi shi','\s');regexp_split_to_table
-----------------------shiyishi
(3 rows)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑苹果之主板篇

一、什么是主板 主板,又叫主机板(mainboard)、系统板(systemboard)、或母板(motherboard),是计算机最基本的同时也是最重要的部件之一。主板一般为矩形电路板,上面安装了…

Zabbix自动发现机制

Zabbix的自动发现机制 Zabbix客户端主动的和服务端联系,将自己的地址和端口发送服务端,实现自动添加监控主机,客户端是主动的一方缺点自定义网段中主机数量太多,等级耗时会很久,而且这个自动发现机制不是很稳定 Zabb…

06 硬件知识入门(MOSS管)

1 简介 MOS管和三极管的驱动方式完全不一样,以NPN型三极管为例,base极以小电流打开三极管,此时三极管的集电极被打开,发射极的高电压会导入,此时电流:Ic IbIe ;电压:Ue>Uc>Ub…

看好美国跨境电商平台Etsy的三个理由

来源:猛兽财经 作者:猛兽财经 不可否认,最近的经济低迷给美国跨境电商平台Etsy(ETSY)的增长带来了一些麻烦。虽然Etsy第三季度营收同比增长了7%,但其商品总量仅增长了1%。如果没有有利的汇率,Etsy的销售额基本上会与前…

中山大学李华山、王彪课题组开发 SEN 机器学习模型,高精度预测材料性能

内容一览:了解全局晶体对称性并分析等变信息,对于预测材料性能至关重要,但现有的、基于卷积网络的算法尚且无法完全实现这些需求。针对于此,中山大学的李华山、王彪课题组,开发了一款名为 SEN 的机器学习模型&#xff…

如何战胜拖延?

来源:《终结拖延症》——(美)威廉克瑙斯 一、常见的影响最大的三种拖延症 (1)第一种拖延症:期限性拖延症 这种拖延症的症状主要是会让你觉得时间还早,然后愉快的玩手机、刷机、打游戏&#xf…

堆栈,BSS,DATA,TEXT

一、目标文件 首先目标文件的构成,Linux下就是.o 文件 编译器编译源码后生成的文件叫目标文件(Object File)。 目标文件和可执行文件一般采用同一种格式,这种存储格式为 ELF。 目前文件的内容至少有编译后的机器指令代码和数据&a…

cocos creator “TypeError: Cannot set property ‘string‘ of null

背景: 学习cocos creator时遇到"TypeError: Cannot set property string of null" 错误。具体代码如下:property({ type: Label })public stepsLabel: Label | null null;update(deltaTime: number) {this.stepsLabel.string Math.floor(…

搜索推荐技术-爱奇艺搜索引擎技术

一、爱奇艺的搜索引擎框架示意图 即通过召回系统,即基于文本匹配的matching system,得到大量视频资源的候选集,经过粗排和精排,最后返回给用户。重点在于召回模块和排序模块。 二、召回模块 召回模块比较重要的是基础相关性&am…

对数据库关系代数中除法运算的理解

一、基本概念 1.象集 给定一个关系R(X,Z),X和Z为属性组,当t[X]x时,x在R中的象集定义为: Z x { t [ Z ] ∣ t ∈ R , t [ X ] x } Z_x\{t[Z]|t\in R,t[X]x\} Zx​{t[Z]∣t∈R,t[X]x} 表示R中属性组X上值为x的诸元组在Z上分量的…

单片机学习13——串口通信

单片机的通信功能: 实现单片机和单片机的信息交换,实现单片机和计算机的信息交换。 计算机通信是指计算机与外部设备或计算机与计算机之间的信息交换。 通信有并行通信和串行通信两种方式。 在多微机系统以及现在测控系统中信息的交换多采用串行通信方…

C++ 多线程 atomic

如有两个线程,对一个变量进行操作,一个线程读这个变量的值,一个线程往这个变量中写值。即使是一个简单变量的读取和写入操作,如果不加锁,也有可能会导致读写值混乱(一条语句可能会被拆成3、4条汇编语句来执…

网络机房的功能有哪些?

网络机房的功能主要包括: 信息存储和管理:机房作为信息系统的核心,需要提供可靠的存储和管理能力,包括服务器、存储设备、备份系统等硬件设备,以及数据备份、数据迁移、容灾等管理方法和技术。网络连接和通信&#xf…

微信公众号的服务器验证方法

服务器上的操作: 将下面的wx.py文件放在服务器上,运行python3 wx.py 80 # -*- coding: utf-8 -*- # filename: main.py import web import handle import hashlibclass WeChatHandler(object):def GET(self):data web.input()if len(data) 0:return &…

汽车软件大时代,如何提升软件工程创新力?

当前,传统汽车产业正加速数字化转型,“软件定义汽车”不断深化。在电动化、智能化和网联化趋势下,汽车软件已经成为汽车技术革新和发展的核心驱动力之一。根据亿欧智库发布的《2023中国智能电动汽车车载软件市场分析报告》,2022年…

java中SPI是什么?

在Java中,SPI(Service Provider Interface)是一种面向接口编程的机制,用于在运行时动态加载实现某一接口的类。SPI机制允许开发者定义服务接口,然后为这个接口寻找实现类,并在运行时动态加载它们&#xff0…

Tomcat主配置文件(server.xml)详解

前言 Tomcat主配置文件(server.xml)是Tomcat服务器的主要配置文件,文件位置在conf目录下,它包含了Tomcat的全局配置信息,包括监听端口、虚拟主机、安全配置、连接器等。 目录 1 server.xml组件类别 2 组件介绍 3 se…

Dockerfile与Docker网络

一、Dockerfile 1、概念: Dockerfile是用来构建docker镜像的文本文件,是由构建镜像所需要的指令和参数构建的脚本。 2、构建步骤: ① 编写Dockerfile文件 ② docker build命令构建镜像 ③ docker run依据镜像运行容器实例 Dockerfile …

信号完整性分析

目录 前言一、信号完整性SI1.1 信号失真1.2 串扰1.3 衰减 二、电源完整性PI2.1 地弹2.2 电源轨道塌陷 三、电磁兼容EMC3.1 电磁辐射3.2 抗干扰 前言 本篇介绍信号完整性分析的知识体系,以及部分分析方法。   什么是信号完整性?通俗来讲,信号在互连线的…

ProEasy机器人案例:电池边包胶

如下图所示,对一个电池三边包边,因客户现场有很多规格电池的大小,所以就需要建立动态的工具坐标来实现适配所有种类的电池 程序如下:Ddome程序 function Speed(num) --速度设置 MaxSpdL(2000) --movl最大速度…