【问题标题】:XML element name from data in Postgres来自 Postgres 中数据的 XML 元素名称
【发布时间】:2015-07-03 09:24:01
【问题描述】:

我在这样的表中有数据:

ID  Date        Side      Qty
1   2015-07-01  buy       1000
2   2015-07-02  buy       1000
3   2015-07-03  sell      1000
4   2015-07-04  sell      1000

我需要将其提取为 XML,格式如下:

<trades>
    <buy>
        <date>2015-07-01</date>
        <qty>1000</qty>
    </buy>
    ...
    <sell>
        <date>2015-07-03</date>
        <qty>1000</qty>      
    </sell>
    ...
</trades>

我正在努力的数据格式指定每个子条目必须包含在标签&lt;buy&gt;&lt;sell&gt; 中,这意味着标签的名称必须从“Side”列生成。问题是我不知道如何从数据中设置 xml 元素的名称,或者即使这是可能的。这是我的代码:

select 
xmlelement(
        name "trades",
        xmlagg(  
        xmlelement(name Side
            xmlconcat(
                xmlelement(name "date", Date), ...

这会生成

<trades>
    <Side>
        <date>2015-07-01</date>
        <qty>1000</qty>
    </Side>
    ...
    <Side>
        <date>2015-07-03</date>
        <qty>1000</qty>      
    </Side>
    ...
</trades>

换句话说,使用“Side”一词代替列的值。是否可以在 Postgres 中使用数据值作为 xml 元素名称?

我正在使用 9.4

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    不能使用任何带有动态标记名的 SQL/XML 函数。您可以使用format 函数。

    postgres=# SELECT * FROM foo;
    ┌──────┬──────┐
    │  nm  │ val  │
    ╞══════╪══════╡
    │ buy  │  100 │
    │ sell │ 1000 │
    │ buy  │  102 │
    │ sell │ 1033 │
    └──────┴──────┘
    (4 rows)
    
    postgres=# SELECT xmlelement(name "trades", xmlagg(x)) 
                  FROM (SELECT format('<%1$s>%2$s</%1$s>', 
                                       nm, 
                                       xmlagg(xmlelement(name value, val)))::xml x 
                            FROM foo group by nm) s;
    ┌─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
    │                                                    xmlelement                                                       │
    ╞═════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╡
    │ <trades><sell><value>1000</value><value>1033</value></sell><buy><value>100</value><value>102</value></buy></trades> │
    └─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
    (1 row)
    

    【讨论】:

    • 谢谢。它认为可能是这样。你的解决方案不错。
    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-15
    • 2020-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多