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

有没有恍然大悟?🤭

相关推荐
惊讶的猫1 分钟前
redis分片集群
数据库·redis·缓存·分片集群·海量数据存储·高并发写
不爱缺氧i10 分钟前
完全卸载MariaDB
数据库·mariadb
纤纡.16 分钟前
Linux中SQL 从基础到进阶:五大分类详解与表结构操作(ALTER/DROP)全攻略
linux·数据库·sql
jiunian_cn30 分钟前
【Redis】渐进式遍历
数据库·redis·缓存
橙露1 小时前
Spring Boot 核心原理:自动配置机制与自定义 Starter 开发
java·数据库·spring boot
冰暮流星1 小时前
sql语言之分组语句group by
java·数据库·sql
符哥20081 小时前
Ubuntu 常用指令集大全(附实操实例)
数据库·ubuntu·postgresql
NuageL1 小时前
原始Json字符串转化为Java对象列表/把中文键名变成英文键名
java·spring boot·json
C++ 老炮儿的技术栈1 小时前
Qt 编写 TcpClient 程序 详细步骤
c语言·开发语言·数据库·c++·qt·算法
怣501 小时前
MySQL子查询零基础入门教程:从小白到上手(零基础入门版)
数据库·mysql