如何从postgres中的json数组中提取特定元素?

时间:2017-05-29 15:17:18

标签: arrays json postgresql

Table parameter image我有一个表参数,有2列id(整数)和param_specs(text)。

实际的param_specs列如上图所示(为了简化它,请查看以下内容: - )

param_specs
[
{"paramName":"param1",
 "type":"string",
 "defaultValue":"tomcat7",
 "optional":false,
 "deploymentParam":false},    
{"paramName":"param123PreStopAction",
 "type":"path",
 "defaultValue":"HELLO",
 "optional":false,
 "deploymentParam":false}
]

所以它是一个json数组的数组,我想获取defaultValue paramName的{​​{1}}字段,即HELLO。

**** **** EDIT 从图像中可以看出,这是我的表名为参数看起来像是有两列我希望得到参数表中每行的 defaultValue ,其中paramName LIKE(%PostStopAction) )或(%PreStopAction)检查图像中的粗体值(即paramName应在实际paramName值中具有PreStopAction或PostStopAction,例如' mytomcat7 PostStopAction '并获取其 defaultValue 即' 停止后'。)

表格中可能有一些行没有任何json具有preStop或PostStop paramName,如图像中的第3行

有人可以帮我查询吗?

由于JGH提出如下建议: -

SELECT" defaultValue" FROM参数a      交叉加入横向      json_to_recordset(a.param_spec :: json)AS x(" paramName" text," defaultValue" text) 在哪里" paramName“LIKE”%PreStopAction'或“paramName”LIKE“%PostStopAction”

1 个答案:

答案 0 :(得分:0)

一种方法是在字段中展开您的数组并查询它们。诀窍是只考虑感兴趣的领域。

persons.forEach(i -> System.out.println(i.getFirstName() + " " + i.getLastName()));

或者,绑定到您的示例:

Select myOutputField 
from json_to_recordset('[the array]') as (myQueryField text, myOutputField text)
where myQueryField = myCondition;

** 编辑 ** 您的数据不会保存在json列中,而是保存在文本列中。您必须将其转换为json(理想情况下,列本身...或至少其内容)。此外,select "defaultValue" from json_to_recordset(' [ {"paramName":"param1", "type":"string", "defaultValue":"tomcat7", "optional":false, "deploymentParam":false}, {"paramName":"param123PreStopAction", "type":"path", "defaultValue":"HELLO", "optional":false, "deploymentParam":false} ]') as x("paramName" text,"defaultValue" text) where "paramName" = 'param123PreStopAction'; 适用于单个项目,而不适用于集合,因此您需要使用json_to_recordset来克服此限制,正如here所解释的那样。

LATERAL JOIN

或者,绑定到您的示例:

SELECT myOutputField 
FROM mytable a
     CROSS JOIN LATERAL
      json_to_recordset(a.jsonintextcolumn::json) as (myQueryField text, myOutputField text)
WHERE myQueryField = myCondition;