如何在PostgreSQL中定义和查询JSON列?


在PostgreSQL中定义JSON列的能力使其变得非常强大,并帮助PostgreSQL用户体验两个世界的优势:SQL和NoSQL。

创建JSON列非常简单。您只需像创建其他列一样创建/定义它,并将数据类型设置为JSON。

让我们在PostgreSQL中创建一个名为json_test的新表:

CREATE TABLE json_test(
   serial_no SERIAL PRIMARY KEY,
   name VARCHAR,
   metadata JSON
);

现在,让我们用一些数据填充它:

INSERT INTO json_test(name, metadata)
VALUES ('Yash','{"marks_scored":{"science":50,"maths":65}}'),
('Isha', '{"marks_scored":{"science":70,"maths":45}}');

如您所见,JSON值是用单引号括起来的,就像我们添加VARCHAR/TEXT值一样。

现在,如果您查询该表(SELECT * from json_test),您将看到以下输出:

序列号姓名元数据
1Yash{"marks_scored":{"science":50,"maths":65}}
2Isha{"marks_scored":{"science":70,"maths":45}}

但是,我们可以做得更好。假设我想知道Yash和Isha在科学方面取得的分数。我只需要使用->运算符即可。请参见下面的示例:

SELECT name, metadata->'marks_scored'->'science' as science_marks
from json_test

输出将是

姓名科学分数
Yash50
Isha70

请注意,这里输出列science_marks的类型为JSON,而不是INTEGER。这是因为→运算符始终返回json。除了→运算符之外,->>运算符也常用于。两者之间的区别在于,→返回json,而->>返回文本。

因此,

  • metadata→'marks_scored'→'science'将返回一个JSON,即使我们为science_marks使用了整数

  • metadata→'marks_scored'->>' science'将返回文本

  • metadata->>'marks_scored'→'science'将报错。因为'marks_scored'输出不再是JSON,因此→运算符无法对其进行操作。

如果您明确需要以整数格式显示science_marks,则首先以文本格式获取结果,然后将其转换为整数,如下所示:

SELECT name, CAST(metadata->'marks_scored'->>'science' as integer)
as science_marks from json_test

请注意,您不能将JSON转换为整数。您需要在最后一步使用->>运算符获取文本输出,然后才能将文本转换为整数。

就像您可以在查询的select部分使用JSON列一样,您也可以在查询的WHERE部分使用它们。如果我们想找出在科学方面得分> 60的学生,您的查询将如下所示

SELECT name from json_test
WHERE CAST(metadata->'marks_scored'->>'science' as integer) > 60

输出将是

姓名
Isha


更新于: 2021年2月2日

1K+浏览量

开启你的职业生涯

通过完成课程获得认证

开始学习
广告