[英]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.