簡體   English   中英

在 XML XPATH POSTGRES 中獲取帶有孩子的訂單節點

[英]Get order nodes with childrens in XML XPATH POSTGRES

我在表中有一些 XML(讓我們稱之為 xml_table),我需要讓父母和他的孩子按完美的順序排列,但它沒有發生。 我會簡化問題。

這是我的 XML:

<group name="A">
    <category target_id="1001">
        <category flow_id="0" />
        <category flow_id="1" />
        <category flow_id="2" />
    </category>
</group>

<group name="B">
    <category target_id="1002">
        <category flow_id="0" />
    </category>
    <category target_id="1003">
        <category flow_id="0" />
    </category>
    <category target_id="1004">
        <category flow_id="0" />
    </category>
    <category target_id="1005">
        <category flow_id="0" />
    </category>
</group>

<group name="C">
    <category target_id="1006">
        <category flow_id="0" />
        <category flow_id="2" />
        <category flow_id="4" />
    </category>
    <category target_id="1007">
        <category flow_id="1" />
        <category flow_id="6" />
    </category>
    <category target_id="1008">
        <category flow_id="0" />
        <category flow_id="1" />
        <category flow_id="2" />
    </category>
    <category target_id="1009">
        <category flow_id="0" />
        <category flow_id="1" />
        <category flow_id="2" />
        <category flow_id="3" />
    </category>
</group>

這是我的 SQL:

SELECT      unnest((xpath('@name', team)::text[])) AS group
            ,unnest((xpath('category/@target_id', team)::text[]::int[]))  AS target_id
            ,unnest((xpath('category/category/@flow_id', team)::text[]::int[]))  AS flow_id
FROM (

        SELECT team::xml
        FROM xml_table;
    )

有了這個 SQL,我在 GROUP A 和 B 的情況下變得完美。當組中只有 1 個 target_id 和許多 flow_id(如 A)

團體 目標 ID Flow_id
一種 1001 0
一種 1001 1
一種 1001 2

完美的作品

當每個target_id只有一個flow_id時,不管target_id是否很多,比如B組。

團體 目標 ID Flow_id
1002 0
1003 0
1004 0
1005 0

工作也很完美。

但是在C組中不起作用,多次重復實例target_id - flow_id甚至混合它,例如出現target_id與其他flow_id而不屬於(這里重復3次Target_id-Flow_id。

團體 目標 ID Flow_id
C 1006 0
C 1006 2
C 1006 4
C 1006 0
C 1006 2
C 1006 4
C 1006 0
C 1006 2
C 1006 4

也混

團體 目標 ID Flow_id
C 1006 0
C 1006 2
C 1006 6

Flow_id = 6 是 target_id = 1007 的一部分,它出現在 target_id = 1006 中。

這是我想得到的,與保存訂單的 XML 的結構相同。

團體 目標 ID Flow_id
一種 1001 0
一種 1001 1
一種 1001 2
1002 0
1003 0
1004 0
1005 0
C 1006 0
C 1006 2
C 1006 4
C 1007 1
C 1007 6
C 1008 0
C 1008 1
C 1008 2
C 1009 0
C 1009 1
C 1009 2
C 1009 3

XPATH 表達式在處理復雜任務時會變得非常討厭。 我的建議:在多個子查詢或 CTE 中拆分操作以使事情變得更容易。 這可能會給你一些啟發:

SELECT DISTINCT
  g.group_id,
  t.target_id,
  unnest(xpath('//group[@name="'||g.group_id||'"]/category/category/@flow_id', team)::text[]) flow_id
FROM 
  xml_table x,
  LATERAL unnest(xpath('//group/@name', x.team)::text[]) g (group_id),
  LATERAL unnest(xpath('//group[@name="'||g.group_id||'"]/category/@target_id', team)::text[]) t (target_id)  
ORDER BY g.group_id,t.target_id,flow_id;

演示: db<>fiddle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM