当前位置: 首页 > 编程笔记 >

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

贺浩壤
2023-03-14
本文向大家介绍如何在PostgreSQL中定义和查询json列?,包括了如何在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 亚什 {“ marks_scored”:{“ science”:50,“ maths”:65}}
2 伊莎 {“ marks_scored”:{“ science”:70,“ maths”:45}}

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

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

输出将是

姓名 science_marks
亚什 50
伊莎 70

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

因此,

  • 即使我们具有science_marks的整数,元数据→'marks_scored'→'science'仍将返回JSON

  • 元数据→'marks_scored'->>'science'将返回文本

  • 元数据->>'marks_scored'→'science'将给出错误。由于'marks_scored'输出不再是JSON,因此→运算符对它不起作用。

如果您明确希望采用整数格式的science_marks,则首先要以文本格式获取结果,然后将其转换为整数,如下所示-

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

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

就像可以在查询的选择部分中使用JSON列一样,也可以在查询的WHERE部分中使用它们。如果我们希望找出在科学方面得分超过60分的学生,您的查询将像

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

输出将是

姓名
伊莎
 类似资料:
  • 问题内容: 在PostgreSQL 9.3.4上,我有一个称为“ person”的JSON类型列,并且其中存储的数据为format 。我想检索索引为0的狗的品种。这是我运行的两个查询: 不起作用 作品 为什么必须进行类型转换?效率低下吗?我是在做错什么,还是对Postgres JSON支持有必要? 问题答案: 这是因为运算符将JSON数组元素获取为文本。您需要强制转换以将其结果转换回JSON。 您

  • 在PostgreSQL 9.3.4中,我有一个名为“person”的JSON类型列,其中存储的数据格式为

  • 我试图使用Django将PostgreSQL表提取到HTML中,当我在PostgreSQL的查询工具中执行空间查询时,我得到了完美的结果,但当我试图从Django执行相同的脚本时,我得到了所有的数据行。谢谢你提前帮忙。 姜戈剧本 HTML

  • 问题内容: 如何声明用于PostgreSQL 8.3查询的变量? 在MS SQL Server中,我可以这样做: 我如何在PostgreSQL中做同样的事情?根据文档,变量被简单地声明为“名称类型;”,但这给了我一个语法错误: 有人可以给我一个正确语法的例子吗? 问题答案: PostgreSQL中没有这样的功能。您只能在pl / PgSQL(或其他pl / *)中执行此操作,而不能在普通SQL中执

  • 如果我在mysql数据库的列中有如下json 如何在mysql中选择同一对象名为'John'且checked=true的所有行。 json对象可能有更多的键,并且键可能没有特定的顺序。

  • 问题内容: 寻找所有的行,其中某个json列包含一个空对象。对于JSON数组,或者在对象中寻找特定键,这是可能的。但是我只想知道对象是否为空。似乎找不到要执行此操作的运算符。 问题答案: 有 没有平等(或等于)运算符 的数据类型 作为一个整体,因为平等是很难建立。 在可行的情况下,请考虑使用Postgres 9.4或更高版本。有关dba.SE(上一章)的相关答案中的更多详细信息: 如何从Postg