2017-05-29 246 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