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 对象:

1
select row_to_json(tableName) from tableName;

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

1
{"id":6013,"text":"advancement","pronunciation":"advancement",...}

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

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

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

1
{"f1":6013,"f2":"advancement"}

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

1
2
3
4
select row_to_json(t)
from (
  select id, text from tableName
AS t

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

1
{"id":6013,"text":"advancement"}

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

我们来看看 array_to_json 的用法:

1
2
3
4
select array_to_json(array_agg(row_to_json(t)))
from (
  select id, text from tableName
AS t

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

1
[{"id":6001,"text":"abaissed"},{"id":6002,"text":"abbatial"},{"id":6003,"text":"abelia"},...]

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select row_to_json(t)
from (
  select text, pronunciation,
    (
      select array_to_json(array_agg(row_to_json(d)))
      from (
        select part_of_speech, body
        from definitions
        where word_id=words.id
        order by position asc
      ) d
    as definitions
  from words
  where text = 'autumn'

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
  "text""autumn",
  "pronunciation""autumn",
  "definitions": [
    {
        "part_of_speech""noun",
        "body""skilder wearifully uninfolded..."
    },
    {
        "part_of_speech""verb",
        "body""intrafissural fernbird kittly..."
    },
    {
        "part_of_speech""adverb",
        "body""infrugal lansquenet impolarizable..."
    }
  ]
}

二、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表由两列组成:

  1. 该  id 列是标识订单的主键列。
  2. info列以JSON的形式存储数据。

插入JSON数据

要将数据插入JSON列,您必须确保数据采用有效的JSON格式。以下INSERT语句将新行插入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语句,该语句类似于查询其他本机数据类型:

SELECT

info

FROM

orders;

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

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

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

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

SELECT

info -> 'customer' AS customer

FROM

orders;

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

SELECT

info ->> 'customer' AS customer

FROM

orders;

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

SELECT

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

FROM

orders

ORDER BY

product;

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

在WHERE子句中使用JSON运算符

我们可以使用JSON运算符in WHERE子句来过滤返回的行。例如,要找出谁购买Diaper,我们使用以下查询:

SELECT

info ->> 'customer' AS customer

FROM

orders

WHERE

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

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

SELECT

info ->> 'customer' AS customer,

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

FROM

orders

WHERE

CAST (

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

) = 2

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

将聚合函数应用于JSON数据

我们可以应用聚合函数MINMAXAVERAGESUM等,以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

PostgreSQL JSON函数

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

json_each函数

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

SELECT

json_each (info)

FROM

orders;

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

json_object_keys函数

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

SELECT

json_object_keys (info->'items')

FROM

orders;

如果你想深入挖掘,还有更多的PostgreSQL JSON函数

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

参考:https://www.cnblogs.com/my4piano/p/5658264.html

https://blog.csdn.net/xfg0218/article/details/83182203

PostgreSQL JSON 处理的更多相关文章

  1. PostgreSQL JSON函数

    https://www.postgresql.org/docs/9.6/static/functions-json.html PostgreSQL 9.6.1 Documentation Prev U ...

  2. PostgreSQL Json字段作为查询条件案例

    业务扩展字段在数据库中经常会使用json格式的数据来存储,这就涉及到一个头疼的问题,假设要使用扩展字段里的某个值作为查询条件怎么办,原来PostgreSQL本身就支持这种查询方式. 例子:假设业务扩展 ...

  3. Java ->在mybatis和PostgreSQL Json字段作为查询条件的解决方案

    Date:2019-11-15 读前思考: 你没想到解决办法? PostgreSQL 数据库本身就支持还是另有解决办法? 说明:首先这次数据库使用到Json数据类型的原因,这次因为我们在做了一个app ...

  4. Postgresql Json Sql

    a detailed website about json sql query; official website: here, chinese version: here Json query: - ...

  5. postgresql模糊查询json类型字段内某一属性值

    需求场景: 目录以jsonb格式存储在数据库表t的chapter字段中,需要菜单路径中包含指定字符串(比如“语文”或者“上学期”)的menu 以下为chapter字段存储json示例: { " ...

  6. 扩展我们的分析处理服务(Smartly.io):使用 Citus 对 PostgreSQL 数据库进行分片

    原文:Scaling Our Analytical Processing Service: Sharding a PostgreSQL Database with Citus 在线广告商正在根据绩效数 ...

  7. postgresql9.4新特性jsonb学习-update更新操作

    先科普下概念:PgSQL9.4 新增 JSONB 数据类型, JSONB 同时属于 JSON (JavaScript Object Notation) 数据类型,jsonb 和 json 的输入数据几 ...

  8. Django performance

    Reference: https://impythonist.wordpress.com/2016/02/21/building-high-performance-django-systems/ Th ...

  9. Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc dtS312 s2018 s3f doc compc\Atitit PathUtil 工具新特性新版本 v8 s312.docx s2018 s3f doc compc\Atitit 操作日

    Atitit s2018 s3 doc list alldvc.docx .docx s2018 s3f doc compc s2018 s3f doc homepc sum doc dvcCompc ...

随机推荐

  1. C++ 每日一题 参数分析 (vector)

    首先给出原题地址: https://www.nowcoder.com/practice/668603dc307e4ef4bb07bcd0615ea677?tpId 以下是代码解析: #include& ...

  2. C语言:求π

    1835: 圆的面积 本题的关键在于如何求π: 今天先给给大家介绍一种针对本题的方法——利用反三角函数求π. 在高数中arcsin(0)=arccos(1)=π,不过编译器中并没有arcsin和arc ...

  3. LeetCode 5216. 统计元音字母序列的数目(Java)DP

    5216. 统计元音字母序列的数目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i', 'o', ...

  4. Linux基础(09)aio高级编程

    1.出于安全性 Linux有一个机制 应用层和内核层是无法互相直接读取内存的, 他们要互相读取数据是有一个拷贝过程的, 如: 应用层要读取内核层的数据就调用read(), 内核就会先把数据copy到一 ...

  5. Fiddler的使用总结

    关于Fiddler的使用过程中的总结: 1. 配置手机抓包的过程,以后再补充 2.使用Fiddler发送请求 1) 第一步 抓取接口,获取请求方式,以及请求参数  2) 第二步 请求接口 点击Exec ...

  6. WinForm下开发插件DevExpress安装及使用

    WinForm下开发插件DevExpress安装及使用在Visual Studio中安装DevExpress开发插件插件的使用方法简单的Demo介绍下载链接:https://pan.baidu.com ...

  7. 2019 前程无忧java面试笔试题 (含面试题解析)

    本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.前程无忧等公司offer,岗位是Java后端开发,最终选择去了前程无忧. 面试了很多家公司,感觉大部分公司考察的点 ...

  8. EditPlus中文版 安装教程

    EditPlus中文版安装教程 1.下载软件压缩包,解压即可.不需要安装,解压后打开“EditPlus中文版”文件夹(软件我会打包好,在文中的最低端找到即可下载:若链接失效了,请告知我一声,我会重新更 ...

  9. Python进阶(六)----装饰器

    Python进阶(六)----装饰器 一丶开放封闭原则 开放原则: ​ 增加一些额外的新功能 封闭原则: ​ 不改变源码.以及调用方式 二丶初识装饰器 装饰器: ​ 也可称装饰器函数,诠释开放封闭原则 ...

  10. 学习网络BGP必备基础知识

    外部网关协议,使用TCP作为传输层协议,支持CIDR,增量更新,距离矢量路由协议,无环路,路由策略丰富,可防止路由震荡,易于扩展. BGP概述 #BGP工作原理 之 报文类型 TCP三次握手 open ...