Skip to main content
 首页 » 数据库

PostgreSQL Array 教程

2022年07月19日137sxdcgaq8080

本文带你学习PostgreSQL Array 类型,包括如何操作数组类型以及一些常用函数。

Array类型

数组类型是 Postgresql 的重要角色之一。每种数据都有其伴随的数组类型,如integer 对应 integer[] ,character 对应 character[] 。针对自定义数据类型,PostgreSQL在后台也创建了对应的伴随数组类型。

PostgreSQL 支持任何有效的数据类型列为数组类型,包括内置类型、用户定义类型、枚举类型。下面示例,定义contacts 表,phone 列定义为数组类型:

CREATE TABLE contacts ( 
	id serial PRIMARY KEY, 
	name VARCHAR (100), 
	phones TEXT [] 
); 

phone 列是一维数组,可以包括多个电话号码。

操作数组值

插入数组值

下面语句插入一条记录:

INSERT INTO contacts (name, phones) 
VALUES('John Doe',ARRAY [ '(408)-589-5846','(408)-589-5555' ]); 

这里使用ARRAY构造函数,也可以直接使用花括号:

INSERT INTO contacts (name, phones) 
VALUES('Lily Bush','{"(408)-589-5841"}'), 
      ('William Gate','{"(408)-589-5842","(408)-589-58423"}'); 

上面语句插入两条记录。需要注意的是使用花括号需要单引号包裹,因此里面内容需要两个引号进行转义。

查询数组数据

使用select 语句查询数组:

SELECT 
	name, 
	phones 
FROM 
	contacts; 

输出:

name phones
John Doe {(408)-589-5846,(408)-589-5555}
Lily Bush {(408)-589-5841}
William Gate {(408)-589-5842,(408)-589-58423}

也可以通过[] 加上下标方式访问数组元素。PostgreSQL 访问数组元素是从1 开始。因此获取第一个电话使用 phone[1]:

SELECT 
	name, 
	phones [ 1 ] 
FROM 
	contacts; 

输出:

name phones
John Doe (408)-589-5846
Lily Bush (408)-589-5841
William Gate (408)-589-5842

也可以在where 条件总使用数据元素过滤记录。请看示例:

SELECT 
	name,phones[2] 
FROM 
	contacts 
WHERE 
	phones [ 2 ] = '(408)-589-58423'; 

输出:

name phones
William Gate (408)-589-58423

修改数组数据

我们也可以修改数组每个元素或整个数组。下面示例更新数组元素:

UPDATE contacts 
SET phones [2] = '(408)-589-5843' 
WHERE ID = 3; 

更新整个数组值:

UPDATE contacts 
SET phones = '{"(408)-589-5843"}' 
WHERE id = 3; 

检索数组

假设我们需要检查phones字段包括特定号码,并不关心是第几个元素,可以使用any() 函数:

SELECT 
	name, 
	phones 
FROM 
	contacts 
WHERE 
	'(408)-589-5555' = ANY (phones); 

展开数组

unnest()函数可以扩展数组为多行,请看示例:

SELECT 
	name, 
	unnest(phones) 
FROM 
	contacts; 

输出:

name unnest
John Doe (408)-589-5846
John Doe (408)-589-5555
Lily Bush (408)-589-5841
William Gate (408)-589-5842
William Gate (408)-589-58423

总结

本文学习 PostgreSQL 数组类型,并通过示例介绍一些数组常用操作及函数。


本文参考链接:https://blog.csdn.net/neweastsun/article/details/118460543
阅读延展