PostgreSQL的Array Type

PostgreSQL的字段类型是有维度的,默认是0,如果设置了维度,就变成了数组类型

这里我们新建一张"articles"文章表,我们一般会给文章打上tag。一个文章会对应多个tag,这种多对一的关系,需要一张表保存tag和文章的对应关系。如果使用有Array Type。可以使用把`tag`字段设置为Array Type,来保存这种多对一的关系,而且查询也很方便。

CREATE TABLE "articles" ("id" int8 NOT NULL, "title" varchar(255) NOT NULL, "tags" varchar(16)[] NOT NULL )

  1. 普通类型后面添加"[]"就转换成对应的数组类型;
  2. 插入数据使用{}包住,使用,分隔。

-- 增加3条测试数据
INSERT INTO "articles" ("id", "title", "tags") VALUES (1, '内容A', '{运动,健康}');
INSERT INTO "articles" ("id", "title", "tags") VALUES (2, '内容B', '{美食,健康}');
INSERT INTO "articles" ("id", "title", "tags") VALUES (3, '内容C', '{运动}');

In Array查询,有ANY和ALL两个方法,ANY是里面有就行了,ALL就得全匹配了。

-- 完全匹配,查询只有"运动"的数据,返回'内容C'的数据
SELECT * FROM "articles" WHERE '运动' = ALL("tags");

-- 包含了"运动"的数据,返回'内容A'和'内容C'
SELECT * FROM "articles" WHERE '运动' = ANY("tags");

查询有"运动"或"美食"的数据要怎么查?需要使用generate_subscripts方法

SELECT * FROM ( SELECT "title", "tags", generate_subscripts ( tags, 1 ) AS "s" FROM "articles" ) AS foo  WHERE tags [s] IN ('运动', '美食')