PostgreSQL 数据库提供 regexp_split_to_table 和 regexp_split_to_array 两个函数的区别

Posted Hi,all

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL 数据库提供 regexp_split_to_table 和 regexp_split_to_array 两个函数的区别相关的知识,希望对你有一定的参考价值。

目录

一、环境

二、函数简介

三、准备数据

四、函数的使用

1、查询学生科目中包含   '英语','中国古典文学'  的学生数据列表

2、查询包含科目 '中国古典文学' 的学生数据列表,可以使用 regexp_split_to_table 函数:

3、查询每个学生的第一个科目,则可以使用regexp_split_to_array 函数:

4、如果把 '英语,中国古典文学' 作为条件,判断某个学生的科目是否包含  '英语,中国古典文学' ,则使用 ARRAY_AGG与 regexp_split_to_table两个函数:

5. regexp_split_to_array函数


 

一、环境

PostgreSQL 9

二、函数简介

PostgreSQL 数据库提供 regexp_split_to_table 和 regexp_split_to_array两个函数都是用来将字符串转换成格式化数据,一个是转换成结果集表,一个是转换成数组。

三、准备数据

/*
Navicat PGSQL Data Transfer

Source Server         : localhost_postgresql
Source Server Version : 90617
Source Host           : localhost:5432
Source Database       : demo
Source Schema         : public

Target Server Type    : PGSQL
Target Server Version : 90617
File Encoding         : 65001

Date: 2021-05-22 10:09:13
*/


-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS "public"."student";
CREATE TABLE "public"."student" (
"id" int8 NOT NULL,
"name" varchar(50) COLLATE "default" DEFAULT NULL::character varying,
"age" int4 DEFAULT 0,
"subjects" text COLLATE "default"
)
WITH (OIDS=FALSE)

;
COMMENT ON COLUMN "public"."student"."id" IS '学生Id';
COMMENT ON COLUMN "public"."student"."name" IS '学生姓名';
COMMENT ON COLUMN "public"."student"."age" IS '学生年龄';
COMMENT ON COLUMN "public"."student"."subjects" IS '学科';

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO "public"."student" VALUES ('1267649126645157889', '李三', '10', '数电,模电,高等数学,中国古典文学');
INSERT INTO "public"."student" VALUES ('1267649406472343553', '张思', '23', '法律,中国近代历史,英语,微积分,中国古典文学');
INSERT INTO "public"."student" VALUES ('1267649626308399105', '王五', '25', '微积分,政治学,C语言');
INSERT INTO "public"."student" VALUES ('1267649906865393666', '刘金', '26', '中国近代历史');
INSERT INTO "public"."student" VALUES ('1267650126948913154', '赵素', '22', '信息系统,英语,高等数学');
INSERT INTO "public"."student" VALUES ('1267650232267886593', '秦思源', '21', '信息系统');
INSERT INTO "public"."student" VALUES ('1267650627836891138', '何一', '22', '信息系统,微积分,英语,模电');
INSERT INTO "public"."student" VALUES ('1267650717641134082', '颜大', '26', '法律,高等数学,英语,C语言,计算机网络技术,模电,中国古典文学,政治学');
INSERT INTO "public"."student" VALUES ('1267650824595886081', '阿婷', '25', '法律,音乐,高等数学,英语,C语言,计算机网络技术,模电,中国古典文学,政治学,美术,中国现代文学');

-- ----------------------------
-- Alter Sequences Owned By 
-- ----------------------------

-- ----------------------------
-- Primary Key structure for table student
-- ----------------------------
ALTER TABLE "public"."student" ADD PRIMARY KEY ("id");

四、函数的使用

1、查询学生科目中包含   '英语','中国古典文学'  的学生数据列表

SELECT * FROM student t
WHERE regexp_split_to_array(t.subjects,',') @> array['英语','中国古典文学']

SELECT * FROM student t
WHERE regexp_split_to_array(t.subjects,',') @> regexp_split_to_array('英语,中国古典文学',',')

2、查询包含科目 '中国古典文学' 的学生数据列表,可以使用 regexp_split_to_table 函数:

SELECT DISTINCT
    t.id,t.name,t.age,
    t.subjects
from (
    select id,name,age, regexp_split_to_table(subjects, ',') as subjects from student
    ORDER BY id
) t
where t.subjects = '中国古典文学'

 

3、查询每个学生的第一个科目,则可以使用regexp_split_to_array 函数:

select
t.id,t.name,t.age,
t.subjects[1]
from (
select id,name,age, regexp_split_to_array(subjects, ',') as subjects from student
) t

4、如果把 '英语,中国古典文学' 作为条件,判断某个学生的科目是否包含  '英语,中国古典文学' ,则使用 ARRAY_AGG与 regexp_split_to_table两个函数:

SELECT
ARRAY_AGG (r1 ORDER BY r1) @> ARRAY_AGG (r2 ORDER BY r2) as has
FROM
regexp_split_to_table(
(
SELECT
subjects
FROM
"public".student
WHERE
ID = 1267650824595886081
) :: VARCHAR,
','
) r1,
regexp_split_to_table(
'英语,中国古典文学' :: VARCHAR,
','
) r2

 

5. regexp_split_to_array函数

regexp_split_to_array(subjects,',') @> regexp_split_to_array('英语,中国古典文学',',')

@> 包含的关系,不指定顺序

subjects  包含  数据:'英语','中国古典文学'

=   相等的关系

subjects  等于   数据:'英语','中国古典文学'

!= 不等的关系

subjects  不等于   数据:'英语','中国古典文学'

&& 存在

subjects  包含   数据:'英语','中国古典文学' 其中的一条

以上是关于PostgreSQL 数据库提供 regexp_split_to_table 和 regexp_split_to_array 两个函数的区别的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSql基于Standby的异步流主从复制

深入浅出PostgreSQL数据库---连接到PostgreSQL数据库

用于PostgresQL的本机Azure数据库与Azure VM中的PostgresQL docker容器

Oracle SQL 劈开字符串

在 Rails 应用程序中向 PostgreSQL 提供 SSL 证书

Heroku 上带有 Postgresql 的 Django - settings.DATABASES 配置不正确。请提供名称值