java postgresql json_PostgreSQL JSON 处理

1.JSON类型

PostgreSQL支持JSON和JSONB。这两种类型在使用上几乎完全一致,主要区别是:

(1)JSON类型把输入的数据原封不动的存放到数据库中。JSONB类型在存放时把JSON解析成二进制格式。

(2)JSONB支持在其上建索引,而JSON不能,这是JSONB的一个很大的优点。

(3)JSON中会保留多余的空格,保留重复的Key,保留Key的顺序。JSONB则完全相反,不保留多余的空格,不保留重复的Key,不保留Key的顺序。

JSON类型与PostgreSQL数据库类型的映射:

JSON类型          PostgreSQL类型                        注意事项

string                  text                                             注意字符集的一些限制

number               numeric                                     JSON中没有PostgreSQL中的“NaN”,“infinity”

boolean              boolean                                     JSON仅能接受小写的“true”和“false”

null                      (none)                                       SQL中的NULL代表不同的意思

一、将结果集封装成JSON

关于如何查询返回 JSON,这里 有例子,翻译如下:

一个简单的用法就是使用 row_to_json() 函数,它接受 “行值”并返回 JSON 对象:

上面查询语句返回结果类似如下:

但是有时候我们只需要查询指定的列,那么我们可以使用 row() 结构函数:

select row_to_json(row(id, text)) from tableName;

上面查询语句返回了我们想要的结果,可惜丢失了列名:

为了完善这个需求,我们必须创建一个行类型且将结果转换(cast)到这个行类型,或者使用子查询。子查询会更容易一些:

上面查询语句返回了我们希望的样子:

另一种常用的技术是 array_agg 和 array_to_json。array_agg 是一个聚合函数 sum 或 count。它聚集成一个 PostgreSQL 数组参数。array_to_json 以 PostgreSQL数组 拼合成一个单一的JSON值。

我们来看看 array_to_json 的用法:

上面查询语句返回了一个由 JSON 对象组成的数组:

我们来一个复杂的例子(注:这个例子可能有问题):

上面查询语句返回结果如下:

二、json解析

一些最常见的PostgreSQL JSON运算符和处理JSON数据的函数。

JSON代表JavaScript Object Notation。JSON是一种开放的标准格式,由键值对组成。JSON的主要用途是在服务器和Web应用程序之间传输数据。与其他格式不同,JSON是人类可读的文本。

从版本9.2开始,PostgreSQL支持本机JSON数据类型。它提供了许多用于操作JSON数据的函数和运算符。

让我们开始创建一个  用JSON数据类型练习的新表。

CREATE TABLE orders (

ID serial NOT NULL PRIMARY KEY,

info json NOT NULL

);

该orders表由两列组成:

该  id 列是标识订单的主键列。

该info列以JSON的形式存储数据。

插入JSON数据

要将数据插入JSON列,您必须确保数据采用有效的JSON格式。以下orders表中。

INSERT INTO orders (info)

VALUES

(

'{ "customer": "John Doe", "items": {"product": "Beer","qty": 6}}'

);

这意味着John Doe买了6 一瓶beers。

让我们同时插入多行。

INSERT INTO orders (info)

VALUES

(

'{ "customer": "Lily Bush", "items": {"product": "Diaper","qty": 24}}'

),

(

'{ "customer": "Josh William", "items": {"product": "Toy Car","qty": 1}}'

),

(

'{ "customer": "Mary Clark", "items": {"product": "Toy Train","qty": 2}}'

);

查询JSON数据

要查询JSON数据,请使用该

SELECT

info

FROM

orders;

75dcc086af5f25fd5c7dffee12ba6ba1.png

PostgreSQL以JSON的形式返回结果集。

PostgreSQL提供了两个本机运算符->,->>可帮助您查询JSON数据。

运算符->按键返回JSON对象字段。

运算符->>按文本返回JSON对象字段。

以下查询使用运算符->以JSON的形式获取所有客户:

SELECT

info -> 'customer' AS customer

FROM

orders;

10a5cf3ef629cf2233019fe9628610e8.png

以下查询使用operator ->>以文本形式获取所有客户:

SELECT

info ->> 'customer' AS customer

FROM

orders;

4433a08116d41864652753a53b5a4701.png

因为->运算符返回JSON对象,所以可以使用运算符->>将其链接以检索特定节点。例如,以下语句返回所有已售出的产品:

SELECT

info -> 'items' ->> 'product' as product

FROM

orders

ORDER BY

product;

236d2e41a3effc32e63550095fd93d82.png

首先   info -> 'items'将项目作为JSON对象返回。然后info->'items'->>'product'将所有产品作为文本返回。

在WHERE子句中使用JSON运算符

我们可以使用JSON运算符in Diaper,我们使用以下查询:

SELECT

info ->> 'customer' AS customer

FROM

orders

WHERE

info -> 'items' ->> 'product' = 'Diaper'

861430d7fb0e15bdee9008c266cf8735.png

要了解谁一次购买两种产品,我们使用以下查询:

SELECT

info ->> 'customer' AS customer,

info -> 'items' ->> 'product' AS product

FROM

orders

WHERE

CAST (

info -> 'items' ->> 'qty' AS INTEGER

) = 2

cc381b9803ccc5cd0ae691e1a7dcd723.png

请注意,我们使用类型转换将qty字段转换为INTEGER 类型并将其与两个进行比较。

将聚合函数应用于JSON数据

我们可以应用聚合函数如MIN,MAX,AVERAGE,SUM等,以JSON数据。例如,以下语句返回最小数量,最大数量,平均数量和销售产品的总数量。

SELECT

MIN (

CAST (

info -> 'items' ->> 'qty' AS INTEGER

)

),

MAX (

CAST (

info -> 'items' ->> 'qty' AS INTEGER

)

),

SUM (

CAST (

info -> 'items' ->> 'qty' AS INTEGER

)

),

AVG (

CAST (

info -> 'items' ->> 'qty' AS INTEGER

)

)

FROM

orders

4ae375302decad63b8615886f83302ce.png

PostgreSQL JSON函数

PostgreSQL为我们提供了一些帮助您处理JSON数据的函数。

json_each函数

该json_each()函数允许我们将最外层的JSON对象扩展为一组键值对。请参阅以下声明:

SELECT

json_each (info)

FROM

orders;

67178b39673bf80eef7b1b6566e65a70.png

如果要将一组键值对作为文本,则使用该  json_each_text()函数。

json_object_keys函数

要在最外层的JSON对象中获取一组键,请使用该  json_object_keys() 函数。以下查询返回列中嵌套items对象的所有键info

SELECT

json_object_keys (info->'items')

FROM

orders;

96ebbdc5b032d418dc62b3c178a10f9e.png

在本教程中,我们向您展示了如何使用PostgreSQL JSON数据类型。我们向您展示了一些最重要的JSON运算符和函数,可帮助您更有效地处理JSON数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值