PostgreSQL xpath 缺少父数据

PostgreSQL xpath missing parent data

提问人:Gavin 提问时间:11/10/2023 最后编辑:nbkGavin 更新时间:11/11/2023 访问量:21

问:

我正在尝试从 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
XML PostgreSQL

评论


答:

1赞 Yitzhak Khabinsky 11/11/2023 #1

请尝试以下基于 的解决方案。XMLTABLE()

dbfiddle

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