PostgreSQL hstore


PostgreSQL hstore

在本节中,我们要了解的工作PostgreSQL的hstore数据类型,例子中的hstore数据类型,我们,也看到的例子hstoreWHERE子句,这有助于我们处理hstore数据值更机智。

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

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

并且还可以看到avals(), svals(), akeys() skeys(), EACH(), hstore_to_json() 函数的用法。

什么是 PostgreSQL hstore 数据类型?

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

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

PostgreSQL hstore 数据类型的语法

PostgreSQL hstore 数据类型的语法如下:

variable_name hstore;

在我们开始学习 hstore 数据类型之前,我们必须首先允许 hstore 扩展,它为我们的 PostgreSQL 插图加载contrib 模块

启用 PostgreSQL hstore 扩展

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

CREATE EXTENSION hstore;

输出

执行上述命令后,我们将得到以下消息:已使用Create Extension命令成功安装了hstore 扩展

PostgreSQL hstore

PostgreSQL hstore 数据类型示例

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

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

电影\表包含各列如Movie_id,MOVIE_NAME,Movie_attr并具有以下特性:

  • Movie_id是主键,这是用来查找电影。
  • Movie_name是电影的其他名称
  • 并且Movie_attr列用于包含 Movies 的属性,例如rating、movie_genres、language、running_time 和 release year

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

要将Movie\表创建到类似的组织数据库中,我们在其中启用 hstore 扩展,我们使用CREATE命令,如下面的命令所示:

CREATE TABLE Movie (  
    Movie_id serial primary key,  
    Movie_name VARCHAR,  
    Movie_Attr hstore  
);

输出

在执行上述命令时,我们将收到以下消息,表明已成功创建Movie\表。

PostgreSQL hstore

Movie\表创建成功后,我们将在INSERT命令的帮助下向其中插入一些值。

将值插入 PostgreSQL hstore 列

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

INSERT INTO Movie (Movie_name, Movie_attr)  
VALUES  
(       'Avengers Endgame',  
        '"rating" => "8.4",  
       "movie_genres" => "Action/Sci-fi",  
       "language" => "English",  
       "release_year" => "2019",  
        "running_time" => "181 Minutes"'   
),    
    (   'US',  
        '"rating" => "6.9",  
       "movie_genres" => "Horror/Thriller",  
       "language"  => "English",  
       "release_year" => "2019",  
        "running_time"  => "116 Minutes"'  
    ),  
 (  'Dolittle',  
        '"rating" => "5.6",  
       "movie_genres" => "Adventure/Family ",  
       "language" => "English",  
       "release_year" => "2020",  
        "running_time" => "101 Minutes"'  
);

输出

执行上述命令后,我们会得到如下消息窗口,显示指定的值已成功插入到Movie\表中。

PostgreSQL hstore

注意:正如我们在上面的插入命令中看到的,我们插入到 hstore 列中的值是一个逗号分隔的键 => 值对列表。并且键和值都使用双引号 (") 引用。

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

从 hstore 列中选择值

hstore 列中选择值等同于在SELECT 命令的帮助下从具有本机数据类型的列中选择值,如下所示:

Select *   
FROM Movie;

输出

成功执行上述命令后,我们将得到以下输出,其中显示了Movie\表中存在的所有数据:

PostgreSQL hstore

为特定键选择数据

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

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

SELECT  
Movie_attr -> 'running_time' AS Time_duration  
FROM  
Movie;

输出

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

PostgreSQL hstore

在 WHERE 子句中使用 hstore 数据值

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

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

在下面的示例中,我们尝试获取电影的Movie_nameMovie_genres,其中Relases_year值与 2019 匹配:

SELECT  
Movie_name, Movie_attr -> 'movie_genres' AS Genres  
FROM Movie  
WHERE Movie_attr -> 'release_year' = '2019';

输出

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

PostgreSQL hstore

从 hstore 列中检索所有值

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

在以下示例中,我们在avals()函数的帮助下从Movie\表中的 hstore 列中获取所有值:

SELECT avals (Movie_attr)  
FROM Movie;

输出

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

PostgreSQL hstore

或者

如果我们想以集合的形式检索输出,我们可以使用svals()函数。

在以下命令中,我们使用svals() 函数而不是avals( ) 来获取作为集合的输出:

SELECT svals (Movie_attr)  
FROM Movie;

输出

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

PostgreSQL hstore

从 hstore 列中检索所有键

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

SELECT akeys (Movie_attr)  
FROM Movie;

输出

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

PostgreSQL hstore

或者

如果我们希望 PostgreSQL 作为一个集合检索输出,我们可以使用skey() 函数

在以下命令中,我们使用skey() 函数而不是akeys( ) 来获取作为集合的输出:

SELECT skeys (Movie_attr)  
FROM Movie;

输出

执行上述命令后,我们将得到以下输出作为集合:

PostgreSQL hstore

将 hstore 数据修改为集合

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

SELECT Movie_name,   
(EACH(Movie_attr)).*   
FROM Movie;

输出

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

PostgreSQL hstore

将 hstore 数据修改为 JSON

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

SELECT Movie_name,   
hstore_to_json (Movie_attr) json  
FROM Movie;

输出

执行上述命令后,我们会得到如下结果,说明我们已经成功将hstore数据修改为json:

PostgreSQL hstore

将键值对添加到当前行

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

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

UPDATE Movie  
SET Movie_attrMovie_attr = Movie_attr || '"Country"=>"United States"':: hstore;

输出

执行上面的命令后,我们会得到下面的结果,这表明三列已经更新成功。

PostgreSQL hstore

现在,如果我们要查看“Country”=>“United States”值是否已成功更新。

SELECT Movie_name,  
Movie_attr -> 'Country' AS Country  
FROM Movie;

输出

执行上述命令,我们将得到以下结果,显示Country Movie_attrUnited States已更新为指定值。

PostgreSQL hstore

更新当前的键值对

我们可以在UPDATE命令的帮助下更新当前的键值对

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

UPDATE Movie  
SET Movie_attrMovie_attr = Movie_attr || '"Country"=> "USA"' ::hstore;

输出

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

PostgreSQL hstore

删除当前键值对

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

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

在下面的命令中,我们将删除Movie_ attr列中的“Country”=>“USA ”键值对。

UPDATE Movie  
SET Movie_attr = delete(Movie_attr, 'Country');

输出

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

PostgreSQL hstore

检查 hstore 列中的显式键

运算符用于检查在明确的关键hstore列的内WHERE子句。

在以下示例中,下面的命令检索与所有行Movie_attr,它包含键电影_genres。

SELECT Movie_name,   
Movie_attr->'movie_genres' as genres,  
Movie_attr  
FROM Movie  
WHERE Movie_attr ? 'movie_genres';

输出

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

PostgreSQL hstore

检查键值对

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

让我们看一个例子来看看@> 操作符的用法:

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

SELECT Movie_name  
FROM Movie  
WHERE Movie_attr @> '"language"=>"English"' :: hstore;

输出

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

PostgreSQL hstore

选择具有各种指定键的行

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

在以下示例中,我们可以获取Movie,其中Movie_attr列包含running_timerating键:

SELECT Movie_name  
FROM Movie  
WHERE   
Movie_attr ?& ARRAY [ 'running_time', 'rating' ];

输出

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

PostgreSQL hstore

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

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

SELECT Movie_name  
FROM Movie  
WHERE   
Movie_attr ?| ARRAY [ 'running_time', 'rating' ];

输出

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

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 列具有不同键的行)。