sql - 查询列表中的 JSON 对象 (Postgres 11)
问题描述
我有一个存储 jsonb 的“contact_info”列,如下所示:
[ {"phoneNumber":"123-4567", "emailAddress":"email@address.com"} ]
我正在尝试检索电话号码等于“123-4567”的所有行。
如何在单行查询中做到这一点?我可以返回整个列,SELECT contact_info FROM db_name.db_table;
但没有成功拉动单个对象并查询里面的电话号码。
我一直在看 [this question][1] 但它与我的情况略有不同(json 对象列表与包含列表的 json 对象),我不知道如何将解决方案应用于我的版本问题。
解决方案
如果您的所有数组都只有一个元素,那么这很简单:
select t.*, t.contact_info -> 0 ->> 'emailAddress' as email_address
from db_table t
where t.contact_info -> 0 ->> 'phoneNumber' = '123-4567'
否则,可以使用jsonb_array_elements()
横向连接来取消嵌套数组,然后过滤:
select t.*, x.obj ->> 'emailAddress' as email_address
from db_table t
cross join lateral jsonb_array_elements(t.contact_info) x(obj)
where x.obj ->> 'phoneNumber' = '123-4567'
请注意,如果给定数组中的多个对象与电话号码匹配,则会返回多行。如果要避免这种情况,可以使用子查询:
select t.*, x.obj ->> 'emailAddress' as email_address
from db_table t
where exists (
select 1
from jsonb_array_elements(t.contact_info) x(obj)
where x.obj ->> 'phoneNumber' = '123-4567'
)
推荐阅读
- javascript - 在 ASP.Net Core 中使用 Signal R 时,如何在 javascript 中的表中添加单行?
- r - 在 r 中使用 quantile() 来查找值
- logging - 将 Strapi 日志保存到日志文件的好方法?
- go - 如何使用通用 Go 实例化一个新的类型参数指针?
- java - Java Selenium InvalidArgumentException:无法识别的选项 moz:debuggerAddress
- php - 使用 codeigniter 上传文件失败
- c++ - 如果 constexpr,你可以替换 enable_if 来禁用它吗?
- python - pygame.error:库未初始化,虽然已经初始化
- compilation - Fortran 共享库 .so 显示未定义符号错误
- python - 如果不在 pyspark 中,则保持相同 ID 或第一行的两列中的值匹配