如何在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),您将看到以下输出:
序列号 | 姓名 | 元数据 |
---|---|---|
1 | Yash | {"marks_scored":{"science":50,"maths":65}} |
2 | Isha | {"marks_scored":{"science":70,"maths":45}} |
但是,我们可以做得更好。假设我想知道Yash和Isha在科学方面取得的分数。我只需要使用->运算符即可。请参见下面的示例:
SELECT name, metadata->'marks_scored'->'science' as science_marks from json_test
输出将是
姓名 | 科学分数 |
---|---|
Yash | 50 |
Isha | 70 |
请注意,这里输出列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 |