繁体   English   中英

从Postgres中的Json数组对象获取值

[英]Fetching Value from Json Array Object in Postgres

我是Postgres的新手,所以在创建查询时遇到了麻烦。

表定义:

id - primary key,
data - JSON

样本数据:

id       data
--------------------------------------------------------------
1           [{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]

我想使用where子句在我的数据列中找到键(279864)存在

t=# with c(id,data) as (values(1,'[{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]'::json))
select id,json_object_keys(json_array_elements(data)) = '279864' from c;
 id | ?column?
----+----------
  1 | f
  1 | f
  1 | t
  1 | f
(4 rows)

因此您可以使用WHERE EXISTScount(*) > 0或您喜欢的任何其他方式进行检查...

例如, 使用 bool_or (如果至少一个为true,则group为true):

t=# with c(id,data) as (values(1,'[{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]'::json))
, m as (select id,(json_object_keys(json_array_elements(data)) = '279864')j from c)
select id, bool_or(j) from m group by id;
 id | bool_or
----+---------
  1 | t
(1 row)

简而言之:

  1. 使用json_array_elements划分数组进行检查。
  2. 使用json_object_keys分割数组元素的键
  3. 使用bool_or检查至少一个键是否类似于模式

更新为OP是要求“不太复杂”的解决方案,我发布一个猴子入侵,以及:

t=# with c(id,data) as (values(1,'[{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]'::json))
select * from c where data::jsonb::text ~ '(,)|({ )"279863":';
 id |                                                data
----+-----------------------------------------------------------------------------------------------------
  1 | [{"279863":"500040004","awb_no":"18171917033930"},{"279864":"500040003","awb_no":"18171917033931"}]
(1 row)

这当然很滑,也需要一些解释:

  1. 我需要先转换为jsonb以消除可能的语法自由
  2. JSON对象键进行排序,因此,我需要她俩{ {和,案件

将数据列设置为JSONB ,然后可以使用以下命令轻松完成操作:

SELECT * FROM table WHERE data->>'279863' IS NOT NULL;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM