提问人:Gavin 提问时间:11/10/2023 最后编辑:nbkGavin 更新时间:11/11/2023 访问量:21
PostgreSQL xpath 缺少父数据
PostgreSQL xpath missing parent data
问:
我正在尝试从 XML 结构中选择数据,其中 2 个字段位于父条目中,其余字段位于多个子条目中。
SELECT
CAST(unnest(xpath('//LINEINFO/SONUMB/text()', node::xml))AS TEXT) AS salesordernumber,
CAST(unnest(xpath('//LINEINFO/LINPOS/text()', node::xml))AS TEXT) AS linenumber,
CAST(unnest(xpath('//SNUMBINFO/SNUMB/text()', node::xml)) AS TEXT) AS serialnumber,
CAST(unnest(xpath('//SNUMBINFO/SQTY/text()', node::xml)) AS TEXT) AS quantity,
CAST(unnest(xpath('//SNUMBINFO/STATUS/text()', node::xml)) AS TEXT) AS status,
CAST(unnest(xpath('//SNUMBINFO/WEIGHT/text()', node::xml)) AS TEXT) AS weight,
CAST(unnest(xpath('//SNUMBINFO/UPDATE/text()', node::xml)) AS TEXT) AS updatevalue
FROM (
SELECT '<root>
<LINEINFO>
<SONUMB>123123123</SONUMB>
<LINPOS>10</LINPOS>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>47</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>48</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>49</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>50</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>51</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
</LINEINFO>
</root>' as node
) tbl_productionorder
我遇到的问题是父值仅出现在第一个输出记录上,有没有办法让值在所有行上重复。
销售订单编号 | 行号 | 序列号 | 数量 | 地位 | 重量 | 更新值 |
---|---|---|---|---|---|---|
123123123 | 10 | 47 | 1 | 正常 | 0 | 不 |
零 | 零 | 48 | 1 | 正常 | 0 | 不 |
零 | 零 | 49 | 1 | 正常 | 0 | 不 |
零 | 零 | 50 | 1 | 正常 | 0 | 不 |
零 | 零 | 51 | 1 | 正常 | 0 | 不 |
答:
1赞
Yitzhak Khabinsky
11/11/2023
#1
请尝试以下基于 的解决方案。XMLTABLE()
Postres SQL
WITH rs AS
(
SELECT XMLPARSE(DOCUMENT '<root>
<LINEINFO>
<SONUMB>123123123</SONUMB>
<LINPOS>10</LINPOS>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>47</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>48</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>49</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>50</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
<SNUMBINFO>
<STATUS>Normal</STATUS>
<SQTY>1</SQTY>
<SNUMB>51</SNUMB>
<UPDATE>no</UPDATE>
<WEIGHT>0</WEIGHT>
</SNUMBINFO>
</LINEINFO>
</root>') as x
)
select t.*
from rs
cross join XMLTABLE(
'/root/LINEINFO/SNUMBINFO'
PASSING rs.x
COLUMNS
salesordernumber varchar(64) PATH '../SONUMB',
linenumber int PATH '../LINPOS',
serialnumber varchar(10) PATH 'SNUMB',
quantity int PATH 'SQTY',
status varchar(10) PATH 'STATUS',
weight varchar(10) PATH 'WEIGHT',
updatevalue varchar(10) PATH 'UPDATE'
) as t;
输出
销售订单编号 | 行号 | 序列号 | 数量 | 地位 | 重量 | 更新值 |
---|---|---|---|---|---|---|
123123123 | 10 | 47 | 1 | 正常 | 0 | 不 |
123123123 | 10 | 48 | 1 | 正常 | 0 | 不 |
123123123 | 10 | 49 | 1 | 正常 | 0 | 不 |
123123123 | 10 | 50 | 1 | 正常 | 0 | 不 |
123123123 | 10 | 51 | 1 | 正常 | 0 | 不 |
评论