网络营销网站建设公司,淘宝建站服务,如何制作手机免费网站模板,怎么改版网站文章目录 前言实现实现思路坑1坑2坑3 恍然大悟 前言
在PostgreSQL中#xff0c;jsonb有额外的操作符#xff0c;如 、、?、?|、? 可以用来查询是否包含路径/值#xff0c;以及顶层键值是否存在。
详细文章#xff1a;PostgreSQL 操作json/jsonb
那么jsonb有额外的操作符如 、、?、?|、? 可以用来查询是否包含路径/值以及顶层键值是否存在。
详细文章PostgreSQL 操作json/jsonb
那么如果我们不知道路径只想要查询json/jsonb是否存在某个片段那就跟我一起来学习吧 实现
实现思路
思路使用 ::text 将json/jsonb转换成为文本再通过 like 关键字进行模糊查询。
示例
select {a: {b:{c:foo}}}::json::text like %c:foo%; -- true可以看到结果返回true这种思路是正确的。
不过。。。
坑1
再来看一组示例
select {a: {b:{c:foo}}}::json::text like %b:{c: foo}%; -- false结果返回false为什么呢请思考一下。 细心的同学可能发现了%b:{c: foo}% 这段文本的 c: 后面多了一个空格。
坑2
那好吧把冒号后面的空格删除掉示例
select {a: {b:{c:foo}}}::jsonb::text like %c:foo%; -- false结果还是返回false为什么呢
坑3
冒号后面加上空格
select {a: {b:{c:foo}}}::jsonb::text like %b: {c: foo}%; -- true结果返回true为什么呢两段文本明明就不匹配。
因为我偷偷把 json 换成了 jsonb。 恍然大悟
看看 json 和 josnb 转换成text的格式。
select {a: {b:{c:foo}}}::jsonb; -- {a: {b: {c: foo}}}
select {a: {b:{c:foo}}}::json; -- {a: {b:{c:foo}}}有没有恍然大悟