如何在PostgreSQL中使用子句GROUP BY XML列?

时间:2019-05-14 11:53:37

标签: xml postgresql

我已经在Postgres中创建了一个包含XML列的表,并且希望使用子句分组依据。 使用方法。

我已经在Postgres中创建了一个包含XML列的表:

book_id | interger
bookinfo|xml

我插入了XML:

enter image description here

我想在查询中使用GROUP BY子句,以显示按性别(男性,女性)写的书数。

1 个答案:

答案 0 :(得分:0)

欢迎来到。

我建议您首先使用XPATH提取所需的信息,然后将其放在额外的列中,或者使用CTE(又名WITH子句)来完成这项工作。后者可以按如下方式完成:

考虑您的表结构和以下数据:

CREATE TABLE t (book_id INT,bookinfo XML);
INSERT INTO t VALUES 
  (1,'<information><sexe>male</sexe><age>60</age></information>'),
  (2,'<information><sexe>male</sexe><age>50</age></information>'),
  (3,'<information><sexe>female</sexe><age>42</age></information>'), 
  (4,'<information><sexe>male</sexe><age>50</age></information>');

..执行以下查询:

WITH j AS (
SELECT 
  (XPATH('/information/sexe/text()',bookinfo))[1]::TEXT AS sexe,
  (XPATH('/information/age/text()',bookinfo))[1]::TEXT AS age
FROM t)
SELECT j.age,j.sexe,COUNT(*) AS qt FROM j
GROUP BY age,sexe
ORDER BY qt DESC;

 age |  sexe  | qt 
-----+--------+----
 50  | male   |  2
 42  | female |  1
 60  | male   |  1
(3 Zeilen)

根据表的大小,CTE可能会非常慢。如果是这样,请考虑解析数据并将其存储在额外的列中。