2016-12-07 15 views
1

xml形式を作成してストアドプロシージャの入力に使用できるようにしたいが、結果がselectクエリの結果であるということは、私が期待している出力ではない。これで私を助けてくれますか?postgre sqlでxml入力を使用した場合の値の不一致

WITH test_xml(data) AS (VALUES 
('<ROOT> 
<record Modelid="1" ModelName="Paul" description="abc" Productid="1"  Modelprice="120987"> 
    <record variationid="20" VariationName="1abc" Variationimage="1abc" variationdesc="1variationdesc"> 
     <item layerid="11" layeris="layer1.js"></item> 
     <item layerid="12" layeris="layer2.js"></item> 
    </record> 
    <record variationid="21" VariationName="2abc" Variationimage="2abc" variationdesc="2variationdesc"> 
     <item layerid="13" layeris="layer3.js"></item> 
     <item layerid="14" layeris="layer4.js"></item> 
    </record> 
</record> 
</ROOT>'::XML) 
) 
SELECT unnest((xpath('//record/@Modelid', test_xml.data))) as Modelid , 
unnest((xpath('//record/record/@variationid', test_xml.data))) as  variationid, 
unnest((xpath('//record/record/item/@layerid', test_xml.data))) as layerid 
FROM test_xml 

出力は次のとおりです。

modelid variationid layerid 1 20 11 1 21 12 1 20 13 1 21 14

が、まさに私が欲しいもの

modelid variationid layerid 1 20 11 1 20 12 1 21 13 1 21 14

答えて

0

には、次の試してみてくださいです:

WITH test_xml(data) AS (VALUES 
('<ROOT> 
<record Modelid="1" ModelName="Paul" description="abc" Productid="1" Modelprice="120987"> 
    <record variationid="20" VariationName="1abc" Variationimage="1abc" variationdesc="1variationdesc"> 
     <item layerid="11" layeris="layer1.js"></item> 
     <item layerid="12" layeris="layer2.js"></item> 
    </record> 
    <record variationid="21" VariationName="2abc" Variationimage="2abc" variationdesc="2variationdesc"> 
     <item layerid="13" layeris="layer3.js"></item> 
     <item layerid="14" layeris="layer4.js"></item> 
    </record> 
</record> 
</ROOT>'::XML) 
) 
SELECT 
    (xpath('//record/@Modelid', models.data))[1] AS modelid, 
    (xpath('//record/@variationid', variations.data))[1] AS variationid, 
    (xpath('//item/@layerid', layers.data))[1] AS layerid 
FROM test_xml 
    JOIN LATERAL unnest(xpath('//record', test_xml.data)) models(data) ON TRUE 
    JOIN LATERAL unnest(xpath('//record/record', models.data)) variations(data) ON TRUE 
    JOIN LATERAL unnest(xpath('//record/item', variations.data)) layers(data) ON TRUE; 
+0

ありがとうございました.....しかし、私はこの関数を理解できませんでした... – pavithra

+0

'LATERAL'について説明しています(https://www.postgresql.org/docs/current/static/ queries-table-expressions.html#QUERIES-LATERAL) - それは、後の 'FROM'リストのエントリが以前のものを参照できることを意味します。そのため、このクエリは各モデルをそのすべての評価とそのすべてのレイヤーに対する各バリエーションに結合します。そして、それぞれのデータが抽出される。あなたの質問の問題は、副選択によって返されたリストの間に接続がないということでした。 –

+0

ありがとうございますが、結果を得る他の方法はありますか? – pavithra

関連する問題