Sqlalchemy json数组,在数组内部执行类似查询

时间:2019-07-02 13:42:28

标签: postgresql sqlalchemy flask-sqlalchemy

我的数据库中有一个表,其中包含一列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中执行此操作,但是如果可能的话,这是首选解决方案;

1 个答案:

答案 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")');