2017-05-29 208 views
1

Table parameter image我有一个表格参数有2列id(整数)和param_specs(文本)。如何在postgres中从json数组中提取特定元素?

实际param_specs柱看起来像上述PIC(为了简化它检查以下内容: - )

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

因此,它是JSON数组的数组,我想获取的paramNameparam123PreStopActiondefaultValue字段HELLO 。

**** ****编辑作为 可这是我的表称为参数看起来就像两列我想每一行的默认值在参数表,其中PARAMNAME图像中可以看出LIKE(%PostStopAction)或(%PreStopAction)检查图像(即PARAMNAME应实际PARAMNAME值,例如,内要么PreStopAction或PostStopAction“mytomcat7 PostStopAction”大胆的价值观和获取其默认值即“后停止')

可能有一些行中不会有任何json有preStop或PostStop paramName像图像中的第3行

有人可以帮我查询吗?

由于JGH一些建议如下: -

选择 “默认值” FROM参数 CROSS JOIN横向 json_to_recordset(a.param_spec :: JSON)为X( “PARAMNAME” 文本, “默认值”文本) WHERE“PARAMNAME” LIKE“%PreStopAction” OR‘PARAMNAME’LIKE‘%PostStopAction’

回答

0

一种方法是爆炸阵列中的字段和查询它们。关键是要考虑的唯一感兴趣的领域。

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

或者绑定到您的例子:

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列,但在文本列。你将不得不将它转换成JSON(理想情况下,列本身......或至少它的内容)。此外,json_to_recordset适用于单个项目,而不是集合,所以您需要使用LATERAL JOIN来克服此限制,正如对here的很好解释。

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

或者绑定到您的例子:

SELECT "defaultValue" 
FROM public.testjsontxt a 
    CROSS JOIN LATERAL 
    json_to_recordset(a.param_specs::json) as x("paramName" text,"defaultValue" text) 
WHERE "paramName" = 'param123PreStopAction'; 
+0

嗨JGH感谢队友,虽然上述方案的作品,但不是通过JSON数组在内部查询我想是选择“默认值”,从json_to_recordset( ' 从参数中选择param_specs :: json)作为x(“paramName”text,“defaultValue”text) 其中“paramName”='param123PreStopAction';你能提出一些建议吗? – 100MIL

+0

请看到,利用侧向的加入 – JGH

+0

再次感谢JGH编辑,但在试图查询选择“默认值” FROM参数 CROSS JOIN横向 json_to_recordset(a.param_specs :: JSON)为x(“PARAMNAME”文本,“defaultValue”text) WHERE“paramName”='param123PreStopAction';它通过给消息失败(json类型的输入语法无效)。请注意表名是参数。任何想法为什么我面临这个问题? – 100MIL