无涯教程要了解的下一个数据类型是 hstore ,用于存储 对于不常见的带有服务属性的各种情况,例如半结构化数据或行。
PostgreSQL hstore数据类型的语法如下:
variable_name hstore;
在无涯教程开始学习HSTORE数据类型之前,无涯教程必须首先允许HSTORE扩展,该扩展为无涯教程的PostgreSQL加载 control模块。
要为无涯教程的PostgreSQL设计启用PostgreSQL hstore扩展,无涯教程可以在 Organization 数据库中使用 CREATE EXTENSION 命令,如以下语句所示:
CREATE EXTENSION hstore;
执行完上述命令后,无涯教程将收到以下消息: hstore扩展已通过 Create Extension 命令成功安装。
让无涯教程看一个示例示例,以了解 PostgreSQL hstore数据类型的工作方式。
无涯教程是创建一个新表作为 Movie 和 hstore列,使用create命令的帮助,并使用它插入一些值插入命令。
Movie 表包含各种列,例如 Movie_id,Movie_name,Movie_attr ,并具有以下属性:
对于 movie_attr 列,无涯教程使用了hstore 数据类型。
CREATE TABLE Movie ( Movie_id serial primary key, Movie_name VARCHAR, Movie_Attr hstore );
执行上述命令后,无涯教程将收到以下消息,该消息显示 Movie 表已成功创建。
要将值插入hstore列,如以下语句所示:
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 表。
在 Movie 表中创建并插入值之后,无涯教程将使用 SELECT 命令从 中检索所有数据
从 hstore列中选择列中选择值。如下图所示:
Select * FROM Movie;
成功执行上述命令后,无涯教程将获得以下输出,其中显示 Movie 表中存在的所有数据:
PostgreSQL的hstore数据类型允许无涯教程使用->运算符从hstore列(Movie_Attr)中选择特定键的数据值。
在下面的示例中,无涯教程使用->运算符在Movie表中标识所有可用电影的运行时间,如以下命令所示:
SELECT Movie_attr -> 'running_time' AS Time_duration FROM Movie;
在实现上面的命令后,无涯教程将获得以下输出,该命令显示每个电影的 runing_time 从 Movie 表。
在下面的示例中,无涯教程正在尝试获得 movie_name 和 movie_genres ,它具有 reliase_year 值匹配2019:
SELECT Movie_name, Movie_attr -> 'movie_genres' AS Genres FROM Movie WHERE Movie_attr -> 'release_year' = '2019';
实施上述命令后,无涯教程将在输出中使用 WHERE子句获取 hstore列的值,如下所示:
要从hstore列中检索所有数据值,无涯教程可以在数组中使用 avals()函数。
在以下示例中,无涯教程借助于 avals()函数从 Movie 表中的hstore列获取所有值:
SELECT avals (Movie_attr) FROM Movie;
执行上述命令后,无涯教程将获得以下输出,其中显示 Movie 表中所有可用的 Moive_attr 值:
或
如果无涯教程要作为一组检索输出,无涯教程可以使用 svals()函数。
在以下命令中,无涯教程使用 svals()函数而不是 avals()将输出作为一个集合:
SELECT svals (Movie_attr) FROM Movie;
在执行上述命令时,无涯教程将获得以下输出:
就像无涯教程可以使用 avals()和svals()函数从hstore列中获取所有值一样,无涯教程可以使用 akeys()函数从hstore中检索所有键:
SELECT akeys (Movie_attr) FROM Movie;
实施上述命令后,无涯教程将获得以下输出,其中显示 Movie 表中可用的 Movie_attr 列的所有 key 值:
或
如果无涯教程希望PostgreSQL以集合的形式检索输出,则可以使用 skey()函数。
在以下命令中,无涯教程使用 skey()函数而不是 akeys()将输出作为一个集合:
SELECT skeys (Movie_attr) FROM Movie;
执行上述命令后,无涯教程将获得以下输出结果:
无涯教程可以使用 EACH()函数来将hstore数据修改为集合,如下面的命令所示:
SELECT Movie_name, (EACH(Movie_attr)).* FROM Movie;
成功执行上述命令后,无涯教程将获得以下输出,该命令将修改后的hstore数据显示为集合:
要将HStore数据更改为 JSON, postgreSQL提供 hstore_to_json()函数。
在以下命令中,无涯教程使用 hstore_to_json()函数将 hstore 数据值转换为 json :
SELECT Movie_name, hstore_to_json (Movie_attr) json FROM Movie;
执行上述命令后,无涯教程将获得以下结果,该命令显示无涯教程已成功将hstore数据修改为json:
无涯教程可以使用hstore列将新的键值对添加到当前行。
例如,无涯教程可以将 Country (国家/地区)键添加到 Movie 的 Movie_attr 列中,如以下命令所示:
UPDATE Movie SET Movie_attr = Movie_attr || '"Country"=>"United States"'::hstore;
执行完上述命令后,无涯教程将得到以下结果,这表明三列已成功更新。
现在,如果无涯教程希望看到“ Country” =>“ United States”值已成功更新。
SELECT Movie_name, Movie_attr -> 'Country' AS Country FROM Movie;
实施上述命令后,无涯教程将获得以下结果。
无涯教程可以在 UPDATE 命令的帮助下更新当前键值对。
例如:在下面的命令中,无涯教程将更新"USA"的"Country"键的值。
UPDATE Movie SET Movie_attr = Movie_attr || '"Country"=> "USA"' ::hstore;
实施上述命令后,无涯教程将获得以下消息窗口,该窗口显示值已成功更新。
PostgreSQL为无涯教程提供了从hstore列中删除当前键/值对的函数。
让无涯教程查看一个样本示例以获得更好的理解:
在下面的命令中,无涯教程要删除Movie_ attr列中的“Country” =>“USA”键/值对。
UPDATE Movie SET Movie_attr = delete(Movie_attr, 'Country');
实施上述命令后,无涯教程将获得以下消息窗口,该窗口显示指定的值已成功更新。
?运算符用于检查 WHERE 子句中 hstore列中的显式键。
在以下示例中,下面的命令用 movie_attr,检索所有行,其中包含键 movie _genres。
SELECT Movie_name, Movie_attr->'movie_genres' as genres, Movie_attr FROM Movie WHERE Movie_attr ? 'movie_genres';
实现上述命令后,无涯教程将获得以下结果,该命令在hstore列中显示指定的键。
无涯教程可以使用@>运算符来选择hstore键值对,让无涯教程看一个示例来了解@>运算符的用法:
以下命令用于从Movie_attr列返回包含键值对的所有行,并且还匹配 "Language"=>"English".
SELECT Movie_name FROM Movie WHERE Movie_attr @> '"language"=>"English"' ::hstore;
成功执行以上命令后,无涯教程将获得以下结果,表示hstore键值对。
?&运算符用于选择其hstore列具有各种键的行。
在以下示例中,无涯教程可以获取Movie,其中 Movie_attr 列同时包含 running_time 和 rating 键:
SELECT Movie_name FROM Movie WHERE Movie_attr ?& ARRAY [ 'running_time', 'rating' ];
执行完以上命令后,无涯教程将得到以下输出:
链接:https://www.learnfk.comhttps://www.learnfk.com/postgresql/postgresql-hstore.html
来源:LearnFk无涯教程网
SELECT Movie_name FROM Movie WHERE Movie_attr ?| ARRAY [ 'running_time', 'rating' ];
执行上述命令后,与?&运算符的输出相比,无涯教程将得到类似的结果:
祝学习愉快!(内容编辑有误?请选中要编辑内容 -> 右键 -> 修改 -> 提交!)