postgresql 操作jsonb数据

news/2024/10/30 9:22:14/

1.操作键值对

PostgreSQL 对 jsonb 类型的筛选查询可以使用 -> 或者 ->> 操作符。

  • -> 操作符用于通过 JSON 对象中的键来获取对应的值。
  • ->> 操作符可以将获取到的值转化为字符串类型。

例如,下面是一个包含 jsonb 类型字段的表: 

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB
);INSERT INTO test (data) VALUES ('{"name": "John", "age": 30, "city": "New York"}');
INSERT INTO test (data) VALUES ('{"name": "Jane", "age": 25, "city": "Los Angeles"}');

 查询方法:

-- 获取所有数据
SELECT * FROM test;-- 根据 jsonb 字段中的键值进行查询
SELECT * FROM test WHERE data -> 'name' = '"John"';
-- 注意:键名需要用单引号括起来,并且键值需要用双引号括起来。-- 使用 ->> 将键对应的值转成字符串进行查询
SELECT * FROM test WHERE data ->> 'age' = '30';

2. 操作json数组

2.1 筛选数据

例如,假设我们有以下包含 jsonb 类型字段的表:

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB
);INSERT INTO test (data) VALUES ('{"name": "John", "age": 30, "cities": ["New York", "Los Angeles"]}');
INSERT INTO test (data) VALUES ('{"name": "Jane", "age": 25, "cities": ["London", "Paris"]}');

查询方法:

-- 获取所有数据
SELECT * FROM test;-- 根据 jsonb 字段中的数组元素进行查询
SELECT * FROM test WHERE data -> 'cities' @> '["New York"]';
-- 上面的语句查询出 "cities" 数组中包含 "New York" 元素的数据项。
-- @> 操作符表示包含。它用于检查 JSONB 数组是否包含给定元素。-- 如果要查询包含多个元素的数据项,可以在操作符两侧使用 AND 条件:
SELECT * FROM test WHERE data -> 'cities' @> '["New York","Los Angeles"]';-- 使用 ->> 将数组转化为字符串后进行查询
SELECT * FROM test WHERE data ->> 'cities' LIKE '%York%';
-- 上面的语句查询出 "cities" 数组中包含 "York" 子串的数据项。
-- 注意:这里使用了 LIKE 操作符,需要将数组先转换成字符串。-- 使用 ANY 操作符进行查询
SELECT * FROM test WHERE 'New York' = ANY(data -> 'cities');
-- 上面的语句查询出 "cities" 数组中包含 "New York" 元素的数据项。
-- 注意:ANY 操作符需要在数组左侧使用,并且等号(=)右边的值必须是一个数组元素的值。

2.2 如何判断数组是否为空

要筛选出键名对应的数组不是空的 JSONB 数据项,可以使用 ? 操作符或者jsonb_array_length() 函数。

例如,假设我们有以下包含 jsonb 类型字段的表:

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB
);INSERT INTO test (data) VALUES ('{"name": "John", "age": 30, "cities": ["New York", "Los Angeles"]}');
INSERT INTO test (data) VALUES ('{"name": "Jane", "age": 25, "cities": []}');

 查询方法:

-- 获取所有数据
SELECT * FROM test;-- 筛选出键名对应的数组不是空的数据项
SELECT * FROM test WHERE data -> 'cities' ?| array['{}'];
-- 上面的语句中 {} 表示空数组。?| 操作符用于检查 JSONB 数组是否非空。-- 使用 jsonb_array_length() 函数进行查询
SELECT * FROM test WHERE jsonb_array_length(data -> 'cities') > 0;
-- 上面的语句中 jsonb_array_length() 函数会返回数组的长度。如果大于 0,则表示数组非空。

3. 操作json对象

例如,如果我们有以下包含 jsonb 类型字段的表:

CREATE TABLE test (id SERIAL PRIMARY KEY,data JSONB
);INSERT INTO test (data) 
VALUES ('{"name": "John", "age": 30, "address": {"city": "New York", "state": "NY"}}');
INSERT INTO test (data) 
VALUES ('{"name": "Jane", "age": 25, "address": {"city": "Los Angeles", "state": "CA"}, "phone": "123-456-7890"}');

查询方法:

-- 获取所有数据
SELECT * FROM test;-- 根据 jsonb 字段中的嵌套对象的键值进行查询
SELECT * FROM test WHERE data -> 'address' ->> 'city' = 'New York';
-- 上面的语句查询出 "address" 对象中 "city" 键对应的值为 "New York" 的数据项。-- 使用 ? 操作符判断是否包含指定的键名
SELECT * FROM test WHERE data ? 'phone';
-- 上面的语句查询出包含 "phone" 键名的数据项。-- 使用 ?? 操作符模糊匹配键名
SELECT * FROM test WHERE data ?? 'address%';
-- 上面的语句查询出包含以 "address" 开头的键名的数据项。
-- 注意:?? 操作符支持通配符,在上例中 % 表示匹配任意字符。-- 使用 @> 操作符判断是否包含指定的 JSON 对象
SELECT * FROM test WHERE data @> '{"age": 30}';
-- 上面的语句查询出包含 "age" 键为 30 的 JSON 对象的数据项。
-- 注意:@> 操作符表示包含。它用于检查 JSONB 是否包含给定对象。-- 使用 -> 和 #> 操作符结合起来查询更深层次的嵌套对象
SELECT * FROM test WHERE data -> 'address' #> '{state}' = 'NY';
-- 上面的语句查询出 "address" 对象中 "state" 键对应的值为 "NY" 的数据项。
-- #> 操作符用于获取一个路径表达式的键对应的值,返回的值可以是原始类型或者 JSONB 类型。

 


http://www.ppmy.cn/news/483507.html

相关文章

解决谷歌翻译无法使用

谷歌翻译无法使用是谷歌官方关闭了中国地区翻译服务。 废话不多说直接上教程,本质就是通过修改hosts文件让translate.googleapis.com域名的IP解析到国内的谷歌服务器IP,网上大部分的教程也是如此。 但是有个问题就是这个IP不稳定可能用了几天就不用了&am…

学习adaboost(一,遍历分类器,c#实现)

我看了很多遍,终于搞懂了,现在编程试一试, 参考文献(十三)通俗易懂理解——Adaboost算法原理 - 知乎 (zhihu.com) 先写一一段代码,把这个数据集里头的所有分类器找出来:一共四种结果&#xff1a…

【MySQL】· 一文了解四大子查询

前言 ✨欢迎来到小K的MySQL专栏,本节将为大家带来MySQL标量/单行子查询、列子/表子查询的讲解✨ 目录 前言一、子查询概念二、标量/单行子查询、列子/表子查询三、总结 一、子查询概念 子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从My…

对不起,ChatGPT 不会干掉你,而是干掉整个行业

观点| Mr.K 主笔| Wendy.L 来源| 技术领导力(ID:jishulingdaoli) 近日,根据网站流量监测平台SimilarWeb的数据,自从OpenAI的对话人工智能工具ChatGPT推出以来,程序员们交流技术问题的问答网站平台Stack Overflow的流量骤降&…

飞机在加速起飞和在空中飞机时的动力是什么提供的?

https://zhidao.baidu.com/question/328511374.html https://blog.csdn.net/FnqTyr45/article/details/78957772?utm_mediumdistribute.pc_relevant.none-task-blog-baidujs-4 (一)起飞滑跑的目的是为了增大飞机的速度,直到获得离地速度。…

飞机绕地球飞行,共需多少架飞机能飞行一圈的问题

题目: 一架飞机在满油的情况下可绕地球飞0.5圈,假设飞机与飞机之间可以互相加油,且地球只有一个基地。请问在确保所有飞机够油飞回起点的情况下,最少需要机架飞机才可以让其中一架飞机成功绕地球飞行一圈?(…

液体传感器应用案例 | 精确把控飞机燃油质量

《逍遥游》有云:适莽苍者,三餐而反,腹犹果然;适百里者,宿舂粮;适千里者,三月聚粮。 而当飞机要想逍遥于九天之上,自然也要准备好相应的燃料。准备多少?如何把控&#xff…

地铁安检处的液体检测仪原理

相信大家都有这样的经历,乘坐地铁出行时,若背包内携带了液体,在安检处总会被安检员要求进行液体检测,只需将液体放在液体检测仪上,在几秒内就能判断待测物是否安全。那么,这神奇的液体检测仪到底是什么原理…