PostgreSQL 查询json/jsonb是否存在某个片段

文章目录


前言

在PostgreSQL中,jsonb有额外的操作符,如 @>、<@、?、?|、?& 可以用来查询是否包含路径/值,以及顶层键值是否存在。

详细文章:PostgreSQL 操作json/jsonb

那么,如果我们不知道路径,只想要查询json/jsonb是否存在某个片段,那就跟我一起来学习吧!


实现

实现思路

思路:使用 ::text 将json/jsonb转换成为文本,再通过 like 关键字进行模糊查询。

示例:

sql 复制代码
select '{"a": {"b":{"c":"foo"}}}'::json::text like '%"c":"foo"%'; -- true

可以看到,结果返回true,这种思路是正确的。

不过。。。

坑1

再来看一组示例:

sql 复制代码
select '{"a": {"b":{"c":"foo"}}}'::json::text like '%"b":{"c": "foo"}%'; -- false

结果返回false,为什么呢?请思考一下。

细心的同学可能发现了,'%"b":{"c": "foo"}%' 这段文本的 "c": 后面多了一个空格。

坑2

那好吧,把冒号后面的空格删除掉,示例:

sql 复制代码
select '{"a": {"b":{"c":"foo"}}}'::jsonb::text like '%"c":"foo"%'; -- false

结果还是返回false,为什么呢?

坑3

冒号后面加上空格

sql 复制代码
select '{"a": {"b":{"c":"foo"}}}'::jsonb::text like '%"b": {"c": "foo"}%'; -- true

结果返回true,为什么呢?两段文本明明就不匹配。

因为我偷偷把 json 换成了 jsonb

恍然大悟

看看 jsonjosnb 转换成text的格式。

sql 复制代码
select '{"a": {"b":{"c":"foo"}}}'::jsonb; -- {"a": {"b": {"c": "foo"}}}
select '{"a": {"b":{"c":"foo"}}}'::json; -- {"a": {"b":{"c":"foo"}}}

有没有恍然大悟?🤭

相关推荐
我又来搬代码了2 小时前
【Android】【bug】Json解析错误Expected BEGIN_OBJECT but was STRING...
android·json·bug
TDengine (老段)10 小时前
TDengine IDMP 快速体验(方式二 通过 docker)
大数据·数据库·docker·ai·时序数据库·tdengine·涛思数据
CANI_PLUS11 小时前
ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库
android·数据库·mysql
国王不在家14 小时前
3.5-非关系型数据库-反规范化-sql语言
数据库·nosql
Code季风15 小时前
如果缓存和数据库更新失败,如何实现最终一致性?
数据库·分布式·缓存·微服务·性能优化
Runing_WoNiu16 小时前
mysql 索引失效分析
数据库·mysql
老纪的技术唠嗑局17 小时前
Dify + OceanBase,AI 业务多场景落地实践
数据库·人工智能
可观测性用观测云17 小时前
TDengine 可观测性最佳实践
数据库
余辉zmh17 小时前
【MySQL基础篇】:MySQL索引——提升数据库查询性能的关键
android·数据库·mysql
weixin_4196583118 小时前
数据库设计简述
数据库·mysql