在 postgre sql 中使用 xml 输入时值不匹配
Mismatch of values when using xml input in postgre sql
我想创建一个 xml 格式,以便我可以在存储过程的输入中使用它,但是来自 select 查询的结果不是我的输出 expecting.Could 你能帮我解决这个问题吗?
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
尝试以下操作:
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;
我想创建一个 xml 格式,以便我可以在存储过程的输入中使用它,但是来自 select 查询的结果不是我的输出 expecting.Could 你能帮我解决这个问题吗?
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
尝试以下操作:
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;