我的数据库中有一个表,其中包含一列form
,该列的数据类型为JSONb
,并且大多数时候数据是这样的:
id = 1
form = [{'label': 'x1', 'value': True},
{'label': 'x2', 'value': 'v1'},
{'label': 'x3', 'value': 'c2'}];
id = 2
form = [{'label': 'x1', 'value': True},
{'label': 'x2', 'value': 'v21'},
{'label': 'x3', 'value': 'v22'}];
我想知道是否可以在该表中进行搜索,以在其c%
字段中的元素上查找文本为form
的行?即在上述情况下,我想获取ID = 1;
没有必要在sqlalchemy
中执行此操作,但是如果可能的话,这是首选解决方案;
答案 0 :(得分:2)
是的,您可以通过将其拆开来实现:
select id
from mytable
join lateral (select jsonb_array_elements(form) as elements) as sub1 on true
join lateral (select key, value from jsonb_each_text(elements)) as sub2 on true
WHERE key = 'value' and value like 'c%';
id
----
1
第一个横向连接将数组的每个项目放入自己的行中。第二个横向联接将对象的每个键,值对放入其自己的行。然后,我们只寻找key ='value'和value'c%'的行。如果您还想搜索值为'c%'的标签,只需删除key ='value'部分。
编辑: 在带有json_path的postgres 12中,这会更容易:
select id
from mytable
where jsonb_path_exists(form, '$.**.value ? (@ starts with "c")');