Postgresql 匹配至少一个对象值不为null的JSONB行
在我们的数据库中,我们有如下数据集:Postgresql 匹配至少一个对象值不为null的JSONB行,postgresql,Postgresql,在我们的数据库中,我们有如下数据集: +----+-------------------------------+ | id | stuff | +----+-------------------------------+ | 1 | {} | +----+-------------------------------+ | 2 | {"a": "something", "b": null}
+----+-------------------------------+
| id | stuff |
+----+-------------------------------+
| 1 | {} |
+----+-------------------------------+
| 2 | {"a": "something", "b": null} |
+----+-------------------------------+
| 3 | {"c": null, "d": null} |
+----+-------------------------------+
在本例中,我只想匹配id=2的值,原因是对象中至少有一个值不是null
如何使用PostgreSQL实现这一点
我知道一个人可以做一些事情,比如去哪里{}但这当然只检查空对象
或者类似的东西->>'a'不是空的,但问题是对象中的键列表不是硬编码的,可以是任何东西
使用函数示例:
此查询由Abelisto提出,请参见注释在更大的数据集上应更有效:
select t.*
from my_table t
where exists (
select 1
from jsonb_each_text(jdata)
where value is not null);
“{a:something,b:null,c:other one}”事实上,我记住了类似于where exists的东西,当值不为null时,从jsonb_each_textjdata中选择1:o IMO使用distinct并不是最理想、最优雅的解决方案。但是最短的解决方案;毫无疑问,您的查询速度更快。我很想知道横向连接而不是交叉连接是否会导致不同的执行plan@HaleemurAli-这是一种横向连接,只是一种不同的表示形式。
select t.*
from my_table t
where exists (
select 1
from jsonb_each_text(jdata)
where value is not null);