PostgreSQL hstore

2025年03月17日 | 阅读 9 分钟

在本节中,我们将了解 PostgreSQL hstore 数据类型的工作原理、hstore 数据类型的示例,我们还将看到 WHERE 子句与 hstore 的示例,这有助于我们更有效地处理 hstore 数据值。

我们将了解如何在 PostgreSQL hstore 数据类型中添加、更新、删除键值对。

我们将讨论以下运算符,例如 -> 运算符(用于选择特定值的数据)、? 运算符(用于检查 hstore 列中是否存在显式键)、@> 运算符(用于检查键值对)、?& 和 ?| 运算符(用于选择 hstore 列具有各种键的行)。

还将看到 avals()、svals()、akeys()、skeys()、EACH()、hstore_to_json() 函数的用法。

什么是 PostgreSQL hstore 数据类型?

在 PostgreSQL 中,我们要了解的下一个数据类型是 hstore,它用于在单元值中存储键值对。对于半结构化数据或具有不常用查询的多个属性的行等各种情况,这始终是正确的方法。

注意:基本上,键和值是文本字符串。

PostgreSQL hstore 数据类型语法

PostgreSQL hstore 数据类型的语法如下

在我们开始学习 hstore 数据类型之前,我们必须先启用 hstore 扩展,它会为我们的 PostgreSQL 示例加载 contrib 模块。

启用 PostgreSQL hstore 扩展

要为我们的 PostgreSQL 设计启用 PostgreSQL hstore 扩展,我们可以使用 Organization 数据库中的 CREATE EXTENSION 命令,如下面的语句所示

输出

执行上述命令后,我们将收到以下消息:hstore 扩展已通过 Create Extension 命令成功安装。

PostgreSQL hstore

PostgreSQL hstore 数据类型示例

让我们看一个示例来了解 PostgreSQL hstore 数据类型的工作原理。

我们正在使用 CREATE 命令创建一个名为 Movie 的新表,并具有 hstore 列,并使用 INSERT 命令插入一些值。

Movie 表包含 Movie_id、Movie_name、Movie_attr 等多个列,具有以下属性

  • Movie_id 是主键,用于查找电影。
  • Movie_name 是电影的另一个名称
  • Movie_attr 列用于包含电影的属性,例如,评分、电影类型、语言、运行时间、发行年份。

对于 Movie_attr 列,我们使用了 hstore 数据类型。

为了在启用 hstore 扩展的 Organization 数据库中创建 Movie 表,我们使用 CREATE 命令,如下面的命令所示

输出

执行上述命令后,我们将收到以下消息,显示 Movie 表已成功创建。

PostgreSQL hstore

当 Movie 表成功创建后,我们将使用 INSERT 命令将一些值插入其中。

将值插入 PostgreSQL hstore 列

要将值插入 hstore 列,我们使用 INSERT 命令,如下面的语句所示

输出

执行上述命令后,我们将收到以下消息窗口,显示指定的值已成功插入 Movie 表。

PostgreSQL hstore

注意:如上一个插入命令所示,我们插入到 hstore 列的值是逗号分隔的键 => 值对的列表。键和值都用双引号(")括起来。

在创建并向 Movie 表插入值后,我们将使用 SELECT 命令检索 Movie 表中的所有数据

从 hstore 列中选择值

从 hstore 列中选择值等于使用 SELECT 命令从具有原生数据类型的列中选择值,如下所示

输出

成功执行上述命令后,我们将看到以下输出,显示 Movie 表中的所有数据

PostgreSQL hstore

选择特定键的数据

PostgreSQL hstore 数据类型允许我们使用 -> 运算符从 hstore 列(Movie_Attr)中选择特定键的数据值。

在下面的示例中,我们使用 -> 运算符来识别 Movie 表中所有可用电影的 running_time,如下面的命令所示

输出

执行上述命令后,我们将获得以下输出,显示 Movie 表中每部电影的 running_time。

PostgreSQL hstore

在 WHERE 子句中使用 hstore 数据值

要过滤 hstore 列的值与输入值匹配的行。因此,在这种情况下,我们可以在 WHERE 子句中使用 -> 运算符。

让我们看一个示例以便更好地理解

在下面的示例中,我们试图获取发行年份为 2019 的电影的 Movie_name 和 Movie_genres。

输出

执行上述命令后,我们将在输出中获得使用 WHERE 子句的 hstore 列的值,如下所示

PostgreSQL hstore

检索 hstore 列中的所有值

要检索 hstore 列中的所有数据值,我们可以使用数组中的 avals() 函数。

在下面的示例中,我们使用 avals() 函数从 Movie 表的 hstore 列中获取所有值

输出

执行上述命令后,我们将看到以下输出,显示 Movie 表中可用的所有 Moive_attr 值

PostgreSQL hstore

如果我们希望将输出作为集合检索,我们可以使用 svals() 函数。

在下面的命令中,我们使用 svals() 函数而不是 avals() 来获取集合形式的输出

输出

执行上述命令后,我们将获得以下集合形式的输出

PostgreSQL hstore

检索 hstore 列中的所有键

就像我们可以使用 avals() 和 svals() 函数从 hstore 列中获取所有值一样,我们可以使用 akeys() 函数来检索 hstore 列中的所有键

输出

执行上述命令后,我们将获得以下输出,显示 Movie 表中 Movie_attr 列的所有键值。

PostgreSQL hstore

如果我们希望 PostgreSQL 以集合形式检索输出,我们可以使用 skey() 函数。

在下面的命令中,我们使用 skey() 函数而不是 akeys() 来获取集合形式的输出

输出

执行上述命令后,我们将获得以下集合形式的输出

PostgreSQL hstore

将 hstore 数据修改为集合

我们可以使用 EACH() 函数将 hstore 数据修改为集合,如下面的命令所示

输出

成功执行上述命令后,我们将获得以下输出,显示修改后的 hstore 数据为集合。

PostgreSQL hstore

将 hstore 数据修改为 JSON

要将 hstore 数据转换为 JSON,PostgreSQL 提供了 hstore_to_json() 函数。

在下面的命令中,我们使用 hstore_to_json() 函数将 hstore 数据值转换为 json

输出

执行上述命令后,我们将获得以下结果,显示我们已成功将 hstore 数据修改为 json。

PostgreSQL hstore

将键值对添加到当前行

我们可以向 hstore 列的当前行添加新的键值对。

例如,我们可以将 Country 键添加到 Movie 表的 Movie_attr 列,如下面的命令所示

输出

执行上述命令后,我们将获得以下结果,显示三列已成功更新。

PostgreSQL hstore

现在,如果我们想看到 "Country"=>"United States" 值已成功更新。

输出

执行上述命令后,我们将获得以下结果,显示指定值的 Country Movie_attr 值 United States 已被更新。

PostgreSQL hstore

更新当前的键值对

我们可以使用 UPDATE 命令来更新当前的键值对。

例如:在下面的命令中,我们将 "Country" 键的值更新为 "USA"。

输出

执行上述命令后,我们将收到以下消息窗口,显示值已成功更新。

PostgreSQL hstore

删除当前的键值对

PostgreSQL 为我们提供了从 hstore 列中删除当前键值对的功能。

让我们看一个示例以便更好地理解

在下面的命令中,我们正在删除 Movie_attr 列中的 "Country"=>"USA" 键值对。

输出

执行上述命令后,我们将收到以下消息窗口,表示指定的值已成功更新。

PostgreSQL hstore

检查 hstore 列中是否存在显式键

? 运算符用于在 WHERE 子句中的 hstore 列中检查显式键。

在下面的示例中,下面的命令检索所有包含 Movie_genres 键的 Movie_attr 行。

输出

执行上述命令后,我们将获得以下结果,显示 hstore 列中的指定键。

PostgreSQL hstore

检查键值对

我们可以使用 @> 运算符来选择 hstore 键值对。

让我们看一个示例来查看 @> 运算符的用法

下面的命令用于返回 Movie_attr 列中包含键值对的所有行,并且还匹配 "Language"=>"English"。

输出

成功执行上述命令后,我们将获得以下结果,表示 hstore 键值对。

PostgreSQL hstore

选择包含各种指定键的行

?& 运算符用于选择 hstore 列具有各种键的行。

在下面的示例中,我们可以获取 Movie,其中 Movie_attr 列同时包含 running_time 和 rating 键

输出

在执行上述命令后,我们将获得以下输出

PostgreSQL hstore

注意:我们也可以在 ?& 运算符的位置使用 ?| 运算符,以检查 hstore 列是否包含键列表中的任何键。

在下面的命令中,我们使用 ?| 运算符而不是 ?& 来获取 hstore 列包含键列表中任何键的那些行。

输出

执行上述命令后,与 ?& 运算符的输出相比,我们将获得类似的结果。

PostgreSQL hstore

概述

在 PostgreSQL hstore 数据类型部分,可以对 hstore 数据类型执行最有用的操作。

我们已经学习了以下主题

  • PostgreSQL hstore 数据类型用于在单元值中存储键值对。
  • 我们使用 Create Extension 启用了 PostgreSQL hstore。
  • 通过 -> 运算符,我们可以选择特定值的数据。
  • 我们在 WHERE 中使用了 hstore 数据类型。
  • 我们还可以使用 avals() 函数从 hstore 列检索值。
  • 并且为了获得集合形式的输出,我们可以使用 svals() 函数。
  • 我们可以使用 akeys() 函数从 hstore 值返回所有键。
  • 并且为了返回集合形式的输出,我们可以使用 skeys() 函数。
  • 我们使用 EACH() 函数将 hstore 数据修改为集合。
  • 在 PostgreSQL 的 hstore 数据类型部分,我们还可以使用 hstore_to_json() 函数将 hstore 数据更改为 json。
  • 我们还可以添加、更新、删除 PostgreSQL hstore 数据类型中的键值对。
  • 我们还讨论了以下运算符,例如 ?(用于检查 hstore 列中是否存在显式键)、@>(检查键值对)、?& 和 ?|(用于选择 hstore 列具有各种键的行)。

下一主题PostgreSQL 数组