PostgreSQL hstore数据类型

PostgreSQL hstore 数据类型

本文我们学习PostgreSQL hstore数据类型。

hstore模块实现hstore数据类型用于在单值中存储键值对。hstore数据类型在很多场景中非常有用,如半结构化数据或有很多属性却很少被查询的行。注意键值对仅能为文本字符串。

启用PostgreSQL hstore扩展

使用hstore类型你需要启用hstore扩展,在PostgreSQL实例中加载contrib模块。

CREATE EXTENSION hstore;

创建包括hstore数据类型的表

下面创建books表,共三个字段:

  • id 是主键,唯一表示book.
  • title 是标题
  • attr 存储book的多个属性,如 ISBN, weight, paperback. attr列的数据类型为hstore.

创建语句为:

CREATE TABLE books (
   id serial primary key,
   title VARCHAR (255),
   attr hstore
);

插入数据至PostgreSQL hstore列

使用insert语句:

INSERT INTO books (title, attr)
VALUES
   (
      'PostgreSQL Tutorial',
      '"paperback" => "243",
      "publisher" => "postgresqltutorial.com",
      "language"  => "English",
      "ISBN-13"   => "978-1449370000",
       "weight"   => "11.2 ounces"'
   );

插入hstore列的数据是一组逗号分隔key =>value对,其中key和value都需要使用“”括起来。

下面再插入一行数据:

INSERT INTO books (title, attr)
VALUES
   (
      'PostgreSQL Cheat Sheet',
      '
"paperback" => "5",
"publisher" => "postgresqltutorial.com",
"language"  => "English",
"ISBN-13"   => "978-1449370001",
"weight"    => "1 ounces"'
   );

查询hstore列

从hstore列查询数据类似从基本数据类型列查询数据,使用select语句:

SELECT
   attr
FROM
   books;

在这里插入图片描述

查询特定key的值

PostgreSql hstore提供->操作符,用于查询hstroe列中特定key的值。举例,如果我们想获取所有book记录的isbn-13值,可以使用->操作符,代码如下:

SELECT
   attr -> 'ISBN-13' AS isbn
FROM
   books;

在这里插入图片描述

where子句中使用

我们也可以在where子句中使用->操作符过滤行包含特定值。举例,我们需要查询ISBN-13的值为978-1449370000的book,并返回其title和weight字段:

SELECT
   attr -> 'weight' AS weight
FROM
   books
WHERE
   attr -> 'ISBN-13' = '978-1449370000';

在这里插入图片描述

记录中增加key-value

对于hstore列,可以很容易给现有记录增加key-value,下面示例增加freeshipping"=>“yes”:

UPDATE books
SET attr = attr || '"freeshipping"=>"yes"' :: hstore;

现在我们检查看是否存在"freeshipping"=>“yes”:

SELECT
   title,
        attr -> 'freeshipping' AS freeshipping
FROM
   books;

在这里插入图片描述

更新记录key-value对

我们可以使用update语句更新记录的key-value对,下面语句更新freeshipping的值为no:

UPDATE books
SET attr = attr || '"freeshipping"=>"no"' :: hstore;

删除记录key-value对

PostgreSQL 支持删除hstore列中的key-value对。举例,下面语句删除attr列的"freeshipping"=>“no”:

UPDATE books 
SET attr = delete(attr, 'freeshipping');

检查hstore列中特定key

使用?操作符在where子句中可以检查hstore列中是否包含特定key。举例,下面语句返回所有attr列中包括publisher属性的行:

SELECT
  title,
  attr->'publisher' as publisher,
  attr
FROM
   books
WHERE
   attr ? 'publisher';

在这里插入图片描述

检查hstore列中特定key-value对

使用@>操作符检查hstore列中key-value对。下面语句返回attr列包含"weight"=>"11.2 ounces"的行记录:

SELECT
   title
FROM
   books
WHERE
   attr @> '"weight"=>"11.2 ounces"' :: hstore;

在这里插入图片描述

查询包含多个特定key的记录

使用?&操作符查询hstore列包含多个特定key的记录。举例,下面语句查询attr同时包括language 和 weight键的记录:

SELECT
   title
FROM
   books
WHERE
   attr ?& ARRAY [ 'language', 'weight' ];

在这里插入图片描述
如果你想实现包含其中任何一个,则使用?|操作符代替?&。

返回hstore列所有key

通过akeys()函数返回hstore列中所有key:

SELECT
   akeys (attr)
FROM
   books;

在这里插入图片描述
或者使用skeys()函数返回key集合:

SELECT
   skeys (attr)
FROM
   books;

在这里插入图片描述

返回hstore列所有value

和返回所有键一样,可以通过avals()函数返回所有值:

SELECT
   avals (attr)
FROM
   books;

在这里插入图片描述
或者使用svals()函数返回结果集:

SELECT
   svals (attr)
FROM
   books;

在这里插入图片描述

转换hstore为json

PostgreSQL 提供 hstore_to_json() 函数把hstore列数据转为json:

SELECT
  title,
  hstore_to_json (attr) json
FROM
  books;

在这里插入图片描述

转换hstore为集合

each()函数转换hstore数据为结果集:

SELECT
   title,
   (EACH(attr) ).*
FROM
   books;

在这里插入图片描述

总结

本文我们学习了PostgreSQL 中hstore数据类型,并介绍了操作hstore的各种操作符。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值