Postgresql JSON对象和数组查询

这篇具有很好参考价值的文章主要介绍了Postgresql JSON对象和数组查询。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. Postgresql 9.5以下版本

1.1 简单查询(缺陷:数组必须指定下标,不推荐)

1.1.1 模糊查询
SELECT  * FROM "public"."tf_low_data_testUser" WHERE  "address" #>> '{0,name}' like '%bb%'

address字段是JSONArray类型,所以在路径中,使用数字索引来访问数组元素,从 0 开始计数。

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.1.2 等值匹配
SELECT  * FROM "public"."tf_low_data_testUser" WHERE "address" #>> '{0,name}' = 'bbb'

Postgresql JSON对象和数组查询,Postgresql,JSON查询
如果字段是int类型,后面需要添加::int
Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.1.3 时间搜索
SELECT  * FROM "public"."tf_low_data_testUser" WHERE  "address" #>> '{0,date}' BETWEEN '2023-08-13' AND '2023-08-17'

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.1.4 在列表
SELECT  * FROM "public"."tf_low_data_testUser" WHERE  "address" #>> '{0,name}' IN ('bbb','ccc')

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.1.5 包含
SELECT  * FROM "public"."tf_low_data_testUser" WHERE "address" #> '{0,roles,0,roleUsers}' @> '["eee"]'
  • #>:获取在指定路径的 JSON 对象,路径不存在则返回空。返回类型是json(b)
  • #>>:获取在指定路径的 JSON 对象,路径不存在则返回空。返回类型是text

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2 多层级JSONArray(推荐)

如果表中有一个字段posts,数据结构为

[{
	"name": "aaa",
	"ports": [{
		"port": 443,
		"nickname": "ggg",
		"date": "2023-08-29",
		"address": ["111", "222"]
	}, {
		"port": 80,
		"nickname": "fff",
		"date": "2022-08-29",
		"address": ["333", "444"]
	}]
}, {
	"name": "bbb",
	"ports": [{
		"port": 2443,
		"nickname": "hhh",
		"date": "2021-08-29",
		"address": ["999"]
	}, {
		"port": 280,
		"nickname": "jjj",
		"date": "2020-08-29",
		"address": ["111111"]
	}]
}]
1.2.1 模糊查询

查询nickname like '%jj%'

可以看出有两层JSONArray结构

SELECT * FROM "public"."tf_low_data_testUser" WHERE EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->>'nickname') like '%gg%'
);

当该层级类型是数组就添加CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.2 模糊查询 NOT
SELECT * FROM "public"."tf_low_data_testUser" WHERE NOT EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->>'nickname') like '%gg%'
);

查的是另外三条数据源
Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.3 等值匹配
SELECT * FROM "public"."tf_low_data_testUser" WHERE EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->>'port')::int = 80
);

如果是数字类型后面需要转换 ::int,因为 ->> 操作符的返回类型是 text

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.4 等值匹配 NOT
SELECT * FROM "public"."tf_low_data_testUser" WHERE NOT EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->>'port')::int = 80
);

查的是另外三条数据源
Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.5 时间搜索
SELECT * FROM "public"."tf_low_data_testUser" WHERE EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->>'date') BETWEEN '2022-08-13' AND '2023-08-17'
);

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.6 时间搜索 NOT

查的是另外三条数据源
Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.7 在列表
SELECT * FROM "public"."tf_low_data_testUser" WHERE EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->>'nickname') IN ('ggg','fff')
);

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.8 在列表 NOT

查的是另外三条数据源
Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.9 包含
SELECT * FROM "public"."tf_low_data_testUser" WHERE EXISTS (
  SELECT 1
  FROM jsonb_array_elements("ports") as arr1(obj1) 
	CROSS JOIN jsonb_array_elements(obj1->'ports') as arr2(obj2)
  WHERE (obj2->'address') @> '["444"]'
);

此时使用的操作符是->,返回值是jsonb类型

Postgresql JSON对象和数组查询,Postgresql,JSON查询

1.2.10 包含 NOT

查的是另外三条数据源
Postgresql JSON对象和数组查询,Postgresql,JSON查询

二. Postgresql 9.5和以上版本

也兼容上面的JSON查询

2.1 模糊查询

使用函数jsonb_path_exists(可以指定JSON路径,如果是数组添加[*])的正则查询达到模糊查询的效果

-- like '%ggg%'
SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].nickname ?(@ like_regex "g")')
-- 左模糊 like '%g'
SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].nickname ?(@ like_regex "g$")')
-- 右模糊 like 'g%'
SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].nickname ?(@ like_regex "^g")')
-- 等值匹配
SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].nickname ?(@ like_regex "^ggg$")')

Postgresql JSON对象和数组查询,Postgresql,JSON查询

同样支持NOT文章来源地址https://www.toymoban.com/news/detail-691080.html

2.2 等值匹配

SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].nickname ?(@ == "fff")')

Postgresql JSON对象和数组查询,Postgresql,JSON查询

同样支持NOT

2.3 时间搜索

SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].date ?(@ >= "2022-01-02" && @ <= "2023-08-02")')

Postgresql JSON对象和数组查询,Postgresql,JSON查询

同样支持NOT

2.4 在列表

SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].nickname ?(@ == "ggg" || @ == "fff")')

Postgresql JSON对象和数组查询,Postgresql,JSON查询

同样支持NOT

2.5 包含

等值匹配一样

SELECT * FROM "public"."tf_low_data_testUser" WHERE jsonb_path_exists("ports", '$[*].ports[*].address ?(@ == "222")')

Postgresql JSON对象和数组查询,Postgresql,JSON查询

同样支持NOT

到了这里,关于Postgresql JSON对象和数组查询的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python中如何快速解析JSON对象数组

    由于浏览器可以迅速地解析JSON对象,它们有助于在客户端和服务器之间传输数据。本文将描述如何使用Python的JSON模块来传输和接收JSON数据。 JSON (JavaScript Object Notation)是一种用于数据交换的语法,它对人的读写很简单,对计算机的解析和生产也很简单,而且还可以存储数据。

    2024年02月10日
    浏览(50)
  • PostgreSQL-视图-03-查询对象依赖关系视图-dba_dependencies

    PostgreSQL查询对象依赖关系视图

    2024年02月15日
    浏览(46)
  • 如何将JSON字符串数组转对象集合

    1、、、引入jar 包 2、Java对象转成JSON格式 3、JSON格式字符串转换成Java对象 3.1、直接将JSON字符串转换成Java对象 3.2、先将JSON字符串转换成JSON对象,再转换成Java对象 3.3、如果JSON字符串是一个JSON数组,并且数组里面存放的同一种类型的对象,可以将这个JSON数组转换成Java的Li

    2024年02月02日
    浏览(62)
  • javascript中json 对象 数组之间相互转化的示例

    在JavaScript中,你可以使用 JSON.stringify() 将JSON对象转换为JSON字符串,使用 JSON.parse() 将JSON字符串转换为JSON对象。而要将JSON对象转换为数组,可以使用 Object.values() 方法,而要将数组转换为JSON对象,可以使用 Array.reduce() 方法。下面是这些转换的示例代码: 将JSON对象转换为J

    2024年02月16日
    浏览(40)
  • 如何修改JSON数组中的每个对象的userType属性值

    要修改JSON数组中的每个对象的`userType`属性值,您可以使用JavaScript的`map`函数或`forEach`循环。 以下是使用`map`函数的示例: ```javascript ``` 在上述示例中,我们使用`map`函数遍历原始数据数组,对于每个对象,我们检查是否存在`userType`属性,然后将其值修改为新值(在这里将其

    2024年02月10日
    浏览(55)
  • mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

    建表语句ddl 10w 数据 插入 存储过程  json 类型 vs 普通字符串类型 建表语句ddl CREATE TABLE tb_json_array_test ( id INT NOT NULL AUTO_INCREMENT, user_no VARCHAR(100), user_name VARCHAR(100), score INT, create_time date, update_time date, remark VARCHAR(100), field1 VARCHAR(100), field2 VARCHAR(100), field3 VARCHAR(100), field4 VARCHAR(

    2024年02月04日
    浏览(52)
  • JSON对象字符串在C#中进行像sql一样动态查询

    在C#中,我们可以使用多种方法来根据条件动态查询JSON对象字符串数据,类似于SQL语句查询。 使用JObject JObject是Json.NET中的一个类,可以方便地操作JSON对象。通过JObject,我们可以像使用SQL一样使用LINQ查询语句来查询JSON对象。 示例代码: 使用JsonPath JsonPath是一种基于JSON对象

    2023年04月14日
    浏览(40)
  • PostgreSQL JSON 类型详解

    JSON 代表 JavaScript Object Notation。它是一种开放标准格式,将数据组织成 RFC 7159 中详述的键/值对和数组 使用 JSON 格式存储数据的主要原因之一是架构灵活性。当架构不稳定且频繁更改时,将数据存储在 JSON 中非常有用。如果将每个键存储为列,则会导致频繁的 DML 操作 - 当您的

    2024年02月11日
    浏览(40)
  • postgresql json数据操作

    pg支持json数据操作,2种类型json jsonb postgresql json jsonb 2种数据类型区别 中文解释 PostgreSQL提供了两种数据类型来存储JSON数据: JSON 和 JSONB 。下面是它们之间的区别: JSON: JSON 数据类型在PostgreSQL中将JSON数据按原样存储,不进行额外的处理。它会验证JSON语法,但不强制执行任

    2024年02月15日
    浏览(34)
  • 简述PostgreSQL中json数据类型

            JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于 ECMAScript(European Computer Manufacturers Association, 欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语

    2024年02月06日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包