2017-05-29 31 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配列の配列であると私はparamNameparam123PreStopActionすなわち、HELLOのdefaultValueフィールドを取得したいです。これは、パラメータと呼ばれる私のテーブルは、私はパラメータテーブルのparamNameにはdefaultValue各行のを取得したい2つの列を持つように見えるものである画像で見ることができるように

**** **** EDIT LIKE(%のPostStopAction)または(%PreStopAction)は、画像内の太字の値を確認します(つまり、paramNameには、例えば「mytomcat7 PostStopActionに」実際のparamName値内PreStopActionまたはPostStopActionのいずれかを持っており、そのはdefaultValueを取得する必要があり、すなわち「後停止 ')

画像に行3のようなpreStopまたはPostStopのparamNameを持つjsonが存在しないテーブルには、いくつかの行があります。

誰かがこの質問に手助けできますか?次のようにJGHが何かを示唆したように

: -

SELECT "はdefaultValue" パラメータFROM CROSS横 json_to_recordset(a.param_spec :: JSON)に参加X AS( "paramNameに" テキストを、 "はdefaultValue" 「paramNameには」「%のPreStopAction」OR 『%のPostStopAction『

答えて

0

一つのアプローチは、フィールドに配列を爆発し、それらを照会することで』LIKE』 paramNameに好きです。トリックは興味のあるフィールドのみを考慮することであるテキスト) 。

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'; 

** EDIT ** あなたのデータはJSON形式の列ではなく、テキスト列に保存されません。あなたはそれをjson(理想的には、列自体または少なくともその内容)に変換する必要があります。また、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; 

それとも、あなたの例にバインド:

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_to_recordsetから上記溶液が働くもののおかげでチームメイトではなく、内側のクエリでJSON配列を渡すので、私は、select「はdefaultValue」のような何かをしたいです' パラメータからparam_specs :: jsonを選択します)x( "paramName" text、 "defaultValue" text) "paramName" =' param123PreStopAction ';あなたは何かを提案できますか? – 100MIL

+0

CROSSは、xとLATERAL json_to_recordset(a.param_specs :: JSON)に参加横の使用再びJGH – JGH

+0

おかげに参加します編集を参照してくださいが、クエリは、パラメータFROM 「はdefaultValue」を選択しようとする上で(「paramNameに」テキスト、 "defaultValue" text) WHERE "paramName" = 'param123PreStopAction';メッセージ(型jsonの入力構文が無効です)を与えることで失敗します。テーブル名がparameter.Anyのアイデアであることに注意してください。なぜこの問題に直面していますか? – 100MIL

関連する問題