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"}}}

有没有恍然大悟?🤭

相关推荐
Deamon Tree几秒前
如何保证缓存与数据库更新时候的一致性
java·数据库·缓存
大G的笔记本9 分钟前
MySQL 中的 行锁(Record Lock) 和 间隙锁(Gap Lock)
java·数据库·mysql
llxxyy卢19 分钟前
json的注入
json
洲覆38 分钟前
go-mysql-transfer 伪装从库实现 MySQL 到 Redis 数据同步(完整配置)
数据库·redis·mysql·golang
谅望者1 小时前
SQL 自连接详解:当数据表需要与自己对话(组织层级实战)
数据库·sql·mysql·oracle·database
姚远Oracle ACE1 小时前
解读 “SQL ordered by Physical Reads (UnOptimized)“
数据库·sql·oracle
山峰哥1 小时前
KingbaseES 表空间与模式优化策略深度研究报告
开发语言·数据结构·数据库·oracle·深度优先
九转苍翎1 小时前
深入解析MySQL(6)——存储过程、游标与触发器
数据库·mysql
武子康1 小时前
Java-164 MongoDB 认证与权限实战:单实例与分片集群 整体认证配置实战 最小化授权/错误速查/回滚剧本
java·数据库·分布式·mongodb·性能优化·系统架构·nosql
金仓拾光集1 小时前
《MongoDB 重建索引要锁库?金仓却能边跑边修》
数据库·mongodb·kingbase·kingbasees·数据库平替用金仓·金仓数据库