在PostgreSQL中按XML节点值排序

时间:2015-10-01 08:32:35

标签: xml postgresql

有没有办法在PostgreSQL中的XML列中使用order by功能?

实施例

如果我在XML列中的PostgreSQL数据库中将此xml作为列,有没有办法编写select语句来按<type>属性对结果进行排序?

<items>
 <item>
  <id>1</id>
  <name>Item #1</name>
  <type>Hardware</type>
 </item>
 <item>
  <id>2</id>
  <name>Item #2</name>
  <type>Software</type>
 </item>
</items>

谢谢。

1 个答案:

答案 0 :(得分:1)

基本上,您需要使用xpath()函数1st获取必要的XML元素。然后将所有结果值作为TEXT类型处理以进一步排序(您无法将GROUP BY标识符应用于Postgres XML类型)。实际查询可能如下:

WITH extracted_data AS (
   SELECT id,unnest(xpath('//type/text()',data))::TEXT AS item_type  
   FROM xml_test
) 
SELECT id,item_type FROM extracted_data 
ORDER BY id,item_type DESC;

示例DDL和数据:

-- Sample DDL
CREATE TABLE xml_test (
  id SERIAL PRIMARY KEY,
  data XML
);
-- Sample Data
INSERT INTO xml_test(data) VALUES
  ('<items>
      <item>
        <id>1</id>
        <name>Item #1</name>
        <type>Hardware</type>
      </item>
      <item>
        <id>2</id>
        <name>Item #2</name>
        <type>Software</type>
      </item>
    </items>'::XML),
('<items>
      <item>
        <id>3</id>
        <name>Item #3</name>
        <type>Middleware</type>
      </item>
      <item>
        <id>4</id>
        <name>Item #4</name>
        <type>Other</type>
      </item>
    </items>'::XML);