postgresql - Sqlalchemy json 数组,在数组内执行类似查询
问题描述
我的数据库中有一个表,其中包含一个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
但如果可能的话,这是首选的解决方案;
解决方案
是的,你可以通过拆开它来做到这一点:
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")');
推荐阅读
- python - PyAudio 安装在 Mac 上总是失败
- c# - 为什么 System.Speech.Recognition 没有检测到或插入到文本框中?
- vba - 打开记录集时出现数据类型不匹配错误
- bash - 如何在运行 docker exec 命令时使用 docker 容器的环境变量
- android - 有人用过 Import Sceneform Asset 插件吗?
- react-native - 为什么当我想运行这样的 Android 纱线错误时?
- c - 结构内容更改的库文件 (.a)
- selenium-webdriver - java.lang.AssertionError:尝试使用 getdata 时出现 java.lang.NullPointerException
- flutter - Flutter - CustomScrollview 中带有 HorizontalDragGestureRecognizer 的子小部件
- java - 如何对 Spring Boot 应用程序进行集成测试?