我有一个 XML 文件存储在一个结构相当奇怪的表中:它可以不包含某个节点,可以包含它一次,也可以包含它多次。在下面的示例中,节点“quickFilterValues”处于所有 3 种情况。我想构建一个包含两列的报告:“fieldId”和“quickFilterValues”的计数。您能帮我解决 Oracle 中的 SQL 解决方案吗?
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataView><fieldOptions><fieldId>1</fieldId></fieldOptions><fieldOptions><fieldId>2</fieldId><quickFilterValues>100</quickFilterValues></fieldOptions><fieldOptions><fieldId>3</fieldId><quickFilterValues>10</quickFilterValues><quickFilterValues>20</quickFilterValues><quickFilterValues>30</quickFilterValues></fieldOptions></dataView>
字段ID | 数 |
---|---|
1 | 0 |
2 | 1 |
3 | 3 |
我尝试过使用
create table t(c clob);
insert into t values('<?xml version="1.0" encoding="UTF-8" standalone="yes"?><dataView><fieldOptions><fieldId>1</fieldId></fieldOptions><fieldOptions><fieldId>2</fieldId><quickFilterValues>100</quickFilterValues></fieldOptions><fieldOptions><fieldId>3</fieldId><quickFilterValues>10</quickFilterValues><quickFilterValues>20</quickFilterValues><quickFilterValues>30</quickFilterValues></fieldOptions></dataView>');
select *
from t
cross apply xmltable(
'/dataView/fieldOptions/quickFilterValues'
passing xmltype(t.c)
columns
fo varchar2(250) path '.'
) x;
但这只能得到“quickFilterValues”的总数,我需要它按“fieldId”分组。
XPATH 表达式可以包含像 count() 这样的表达式:
xmltable(
'/dataView/fieldOptions' passing d.xml
columns
fieldId path './fieldId/text()',
nQuickFilterValues number path 'count(./quickFilterValues)'
) t