程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Postgres XML 解析 - 使用 XPath 计算多个同名节点的总和大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决POSTGRes XML 解析 - 使用 XPath 计算多个同名节点的总和?

开发过程中遇到postgres XML 解析 - 使用 XPath 计算多个同名节点的总和的问题如何解决?下面主要结合日常开发的经验,给出你关于POSTGRes XML 解析 - 使用 XPath 计算多个同名节点的总和的解决方法建议,希望对你解决POSTGRes XML 解析 - 使用 XPath 计算多个同名节点的总和有所启发或帮助;

我有一个 xml 片段如下:

<OpCodeLaborInfo JobStatus="F" UpSellFlag="N" JobNo="1" OpCode="02TTZ10K" OpCodeDesc="10K serviCE">
      <TechInfo ActualHrsWorked="2.50" CustTechRate="27.00" TechHrs="0.00" Techname="jeFF SELLERS" TechNo="4816" />
      <TechInfo ActualHrsWorked="0.00" CustTechRate="27.00" TechHrs="0.70" Techname="jeFF SELLERS" TechNo="4816" />
      <BillTimeRateHrs BillRate="129.97" />
      <CCCStmts Correction="PERFORMED 10K serviCE" Complaint="LUBE OIL FILTER CHANGE,TIRE ROTATION,PERFORM MulTI POINT" />
      <CCCStmts Correction="X" Complaint="inspection,InspecT FILTERS AND RECOMMEND,InspecT BRAKES," />
                    <CCCStmts Complaint="BELTS AND HOSES" />
      <roaR_864_11845@ts DlrCost="18.90" PayType="Cust" AmtType="Job" @R_273_10586@lAmt="59.12" />
</OpCodeLaborInfo>
<OpCodeLaborInfo JobStatus="F" UpSellFlag="N" JobNo="2" OpCode="02TTZ10K" OpCodeDesc="10K serviCE">
          <TechInfo ActualHrsWorked="2.50" CustTechRate="27.00" TechHrs="1.00" Techname="jeFF SELLERS" TechNo="4816" />
          <TechInfo ActualHrsWorked="0.00" CustTechRate="27.00" TechHrs="0.00" Techname="jeFF SELLERS" TechNo="4816" />
          <BillTimeRateHrs BillRate="129.97" />
          <CCCStmts Correction="PERFORMED 10K serviCE" Complaint="LUBE OIL FILTER CHANGE,PERFORM MulTI POINT" />
          <CCCStmts Correction="X" Complaint="inspection," />
          <CCCStmts Complaint="BELTS AND HOSES" />
          <roaR_864_11845@ts DlrCost="18.90" PayType="Cust" AmtType="Job" @R_273_10586@lAmt="59.12" />
</OpCodeLaborInfo>

我需要计算每个 OpCodeLaborInfo 的 TechInfo/@TechHrs 的总和。我尝试了以下方法:

unnest(xpath('sum(//dns:repairOrder/dns:roRecord/dns:rolabor/dns:OpCodeLaborInfo/dns:TechInfo/@TechHrs[1])'::text,data_detail.ro_data_xml,ARRAY[ARRAY['dns'::text,'http://www.starstandards.org/STAR'::text]]))::text::numeric AS lbrsoldhours

但这似乎返回了两个 OpCodeLaborInfo 节点内的技术时间总和。有人能告诉我如何调整 xpath 以获得所需的结果。

所以基本上我需要:

工作 技术课
1 sum(0.00+0.70)
2 sum(1.00+0.00)
@H_618_41@

解决方法

我会使用 xmltable()

解决这个问题
SELEct d.job,sum(t.hours)
from data_detail d
  cross join xmltable (
                '/OpCodeLaborInfo/TechInfo'
                passing d.ro_data_xml
                columns hours numeric path '@TechHrs') as t
group by d.job;

Online example


XPath 可能不正确,因为您显示的 XPath 与您的示例 XML 数据不匹配。您的示例 XML 也不包含命名空间,因此我不确定您为什么将其传递给 xpath()

但是如果你需要一个,你可以使用这样的东西:

  cross join xmltable (
                xmlnamespaces ('http://www.starstandards.org/STAR' as dns),'/dns:OpCodeLaborInfo/dns:TechInfo'
                passing d.ro_data_xml
                columns hours numeric path '@TechHrs') as t
,

xpath 也可以正常工作:

SELECT  job,SUM((xpath('//@TechHrs',element))[1]::text::decimal)
FROM    data_detail,LATERAL (SELECT unnest(xpath('/OpCodeLaborInfo/TechInfo',ro_data_xml))) u(element)
GROUP BY job;

fiddle

(基于@a_horse_with_no_name 的小提琴)

@H_618_41@
@H_618_41@

大佬总结

以上是大佬教程为你收集整理的Postgres XML 解析 - 使用 XPath 计算多个同名节点的总和全部内容,希望文章能够帮你解决Postgres XML 解析 - 使用 XPath 计算多个同名节点的总和所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。