postgresSQL多种字符串分割及查询汇总

news/2024/7/2 23:58:33

目录

表及数据准备

SPLIT_PART函数应用及说明

string_to_array函数应用及说明

基于指定规则查询该列所有

按需分割后产生的字符串单独判断

按需分割后产生的字符串及其它列混合查询

以按需分割查询为条件查询其它列

array_length函数应用及说明


表及数据准备

测试表

create table flag_info(
id     int
,name varchar(20)    default ''    -- xx标志
,value             int    default 0            
,PRIMARY KEY(id)
);

插入部分数据

insert into flag_info values(1,'a.b.c', 127);
insert into flag_info values(2,'a.b.d', 6);
insert into flag_info values(3,'a.c.d', 91);
insert into flag_info values(4,'b.c.d', 97);
insert into flag_info values(5,'b.c.e', 5);


看看所有数据:

 select * from flag_info;
 id | name  | value 
----+-------+-------
  1 | a.b.c |   127
  2 | a.b.d |     6
  3 | a.c.d |    91
  4 | b.c.d |    97
  5 | b.c.e |     5
(5 rows)

SPLIT_PART函数应用及说明

1,查询name分割后第二位值=c的所有记录:

# select * from flag_info where SPLIT_PART(name,'.',2) = 'c';
 id | name  | value 
----+-------+-------
  3 | a.c.d |    91
  4 | b.c.d |    97
  5 | b.c.e |     5
(3 rows)

2,查询name分割后第1位值=a的所有记录:

#select * from flag_info where SPLIT_PART(name,'.',1) = 'a';
 id | name  | value 
----+-------+-------
  1 | a.b.c |   127
  2 | a.b.d |     6
  3 | a.c.d |    91
(3 rows)

注意:第几位不从0开始,是从1开始的。

再来,插入一些不包含.的值:

insert into flag_info values(6,'a', 1);
insert into flag_info values(7,'a.b', 1);

现在共7条数据:

#select * from flag_info;
 id | name  | value 
----+-------+-------
  1 | a.b.c |   127
  2 | a.b.d |     6
  3 | a.c.d |    91
  4 | b.c.d |    97
  5 | b.c.e |     5
  6 | a     |     1
  7 | a.b   |     1
(7 rows)

继续:

#select * from flag_info where SPLIT_PART(name,'.',1) = 'a';
 id | name  | value 
----+-------+-------
  1 | a.b.c |   127
  2 | a.b.d |     6
  3 | a.c.d |    91
  6 | a     |     1
  7 | a.b   |     1
(5 rows)

可以看到id=6的也查出来了,id=6的值不包含.   说明分割后默认a就是第1位,同样会被查询出来。

string_to_array函数应用及说明

基于指定规则查询该列所有

select  string_to_array(name,'.') from flag_info;
 {a,b,c}
 {a,b,d}
 {a,c,d}
 {b,c,d}
 {b,c,e}
 {a}
 {a,b}
(7 rows)

查询后返回的是一个array.

按需分割后产生的字符串单独判断

比如获取分割后每个数组的第一个元素:

select ss[1] from (select string_to_array(name,'.')  ss from flag_info ) f;
 ss 
----
 a
 a
 a
 b
 b
 a
 a
(7 rows)

按需分割后产生的字符串及其它列混合查询

除了name分割后的第一个元素,id也想获取怎么办?

select id,ss[1] from (select id,string_to_array(name,'.')  ss from flag_info ) f;
 id | ss 
----+----
  1 | a
  2 | a
  3 | a
  4 | b
  5 | b
  6 | a
  7 | a

以按需分割查询为条件查询其它列


获取第一个元素为a的所有记录的id及name原值:

select id,name from (select id,name,string_to_array(name,'.')  ss from flag_info) f where ss[1]='a';
 id | name  
----+-------
  1 | a.b.c
  2 | a.b.d
  3 | a.c.d
  6 | a
  7 | a.b
(5 rows


再比如只获取分割后第一个元素为a的id:

select id from (select id,string_to_array(name,'.')  ss from flag_info) f where ss[1]='a';
 id 
----
  1
  2
  3
  6
  7
(5 rows)


array_length函数应用及说明

计算所有记录name列分割后的数组长度,并输出id及原name:

select id,name,array_length(string_to_array(name,'.'),1) len from flag_info;
 id | name  | len 
----+-------+-----
  1 | a.b.c |   3
  2 | a.b.d |   3
  3 | a.c.d |   3
  4 | b.c.d |   3
  5 | b.c.e |   3
  6 | a     |   1
  7 | a.b   |   2
(7 rows)

分享无涯,祝君快乐!


http://lihuaxi.xjx100.cn/news/3640.html

相关文章

艾美捷Abnova MYOC (人)抗体对说明书

MYOC 编码蛋白质肌纤蛋白,据信它在细胞骨架功能中起作用。MYOC 在包括小梁网在内的许多眼组织中表达,并被揭示为小梁网糖皮质激素诱导反应蛋白 (TIGR)。小梁网是调节眼压所必需的特殊眼组织,MYOC 的突变已被确定为遗传性青少年型开角型青光眼…

使用Softing为西门子工业边缘开发的edgePlug软件简化了设备与应用程序的连接

一 为西门子工业边缘应用轻松提供控制器数据 作为西门子工业边缘市场的一部分,Softing edgePlug软件产品通过西门子工业边缘(一个由边缘设备、应用程序和设备管理组成的开放、即用型边缘计算平台)将西门子PLC连接到应用程序。 这意味着&…

c语言基础学习笔记(三):while循环

文章目录while循环四位数以下判断数的位数程序示例while循环数位数的算法do-while循环do-while循环实现数位数计算 log2log_2log2​X 的程序示例倒计时循环程序示例猜数游戏程序示例while循环 四位数以下判断数的位数程序示例 人可以一眼看出这是几位数,但计算机不…

Linux-shell常用运维指令

一.常用命令简介: 1.常看程序运行进程 ps -ef |grep javaps命令将某个进程显示出来 grep命令是查找 中间的**|**是管道命令 是指ps命令与grep同时执行 ps是LINUX下最常用的也是非常强大的进程查看命令 grep命令是查找,是一种强大的文本搜索工具 字…

直流有刷电机开环调速基于STM32F302R8+X-NUCLEO-IHM07M1(一)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、STM32F302R8X-NUCLEO-IHM07M1直流电机的开环调速1.1.功能需求1.2.硬件设计1.3.软件设计1.3.1.底层配置1.3.2.应用层开发1.4.实验验证总结前言 主控板STM32F…

总结,复习,整合命令执行漏洞实现及其绕过(绕过方式大全)

🏆今日学习目标: 🍀1复习一下以前的内容 🍀2总结整合一下过滤方法 ✅创作者:贤鱼 🎉个人主页:贤鱼的个人主页 🔥专栏系列:网络安全 ⏰如果有需要可以阅读前两章 25分钟了…

centos7给普通用户添加yum权限办法

首先,创建一个新账号(注意,用户名必须全部小写): useradd -m test111 passwd test111 之后在root账号下修改sudoers ll /etc/sudoers chmod 777 /etc/sudoers 在 root ALL(ALL) ALL 下添加 test111 ALL(ALL) ALL 如果…

Ims通话流程分析

Ims 是3GPP提出的概念,全称为IP Multimedia Subsystem(ip多媒体子系统),是为了满足IP多媒体业务的需求,基于PS域的一个子系统。 WCDMA网络从R99版本开始,与2G/2.5G网络相比,最大的变化在于空口技术的改变,…