在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