sql - 在 PostgreSQL 中使用 XPath 过滤多个 XML 节点
问题描述
有一个 XML 的结构:
- Item
- Documents
- Document
- Records
- Record
- Category
- Code
- Value
这是选择按类别代码过滤的记录值的 SQL 查询
SELECT (xpath('/ns:Record/ns:Value/text()', rec, ARRAY[ARRAY['ns', 'http://some-ns']]))[1]::text AS val
FROM (
SELECT unnest(xpath('/ns:Item/ns:Documents/ns:Document/ns:Records/ns:Record[ns:Category/ns:Code/text()="MAIN.CAT001"]',
'<Item xmlns="http://some-ns"><Documents><Document><Records><Record><Category><Code>MAIN.CAT001</Code></Category><Value>Value 001</Value></Record><Record><Category><Code>MAIN.CAT002</Code></Category><Value>Value 002</Value></Record><Record><Category><Code>MAIN.CAT003</Code></Category><Value>Value 003</Value></Record></Records></Document></Documents></Item>'::xml,
ARRAY[ARRAY['ns', 'http://some-ns']])) AS rec
) t
是否可以不仅按一个“类别代码”过滤“记录”,还可以按多个“类别代码”过滤“记录”?我的意思是我想使用这样的过滤器
ns:Record[ns:Category/ns:Code/text()=("MAIN.CAT001", "MAIN.CAT003")]
或这个
ns:Record[ns:Category/ns:Code/text()="MAIN.CAT001" or ns:Category/ns:Code/text()="MAIN.CAT003"]
但是两种解决方案都不起作用
解决方案
尝试使用contains(ns:Code,"MAIN.CAT001") or contains(ns:Code,"MAIN.CAT003")]
:
SELECT (xpath('/ns:Record/ns:Value/text()', rec, ARRAY[ARRAY['ns', 'http://some-ns']]))[1]::text AS val
FROM (
SELECT
unnest(xpath('/ns:Item/ns:Documents/ns:Document/ns:Records/ns:Record[ns:Category[contains(ns:Code,"MAIN.CAT001") or contains(ns:Code,"MAIN.CAT003")]]',
'<Item xmlns="http://some-ns"><Documents><Document><Records><Record><Category><Code>MAIN.CAT001</Code></Category><Value>Value 001</Value></Record><Record><Category><Code>MAIN.CAT002</Code></Category><Value>Value 002</Value></Record><Record><Category><Code>MAIN.CAT003</Code></Category><Value>Value 003</Value></Record></Records></Document></Documents></Item>'::xml,
ARRAY[ARRAY['ns', 'http://some-ns']])) AS rec
) t;
val
-----------
Value 001
Value 003
推荐阅读
- apache-kafka - 我如何让 kafka 根据提供的保留期删除日志
- php - 使用 LEFT JOIN 多对多
- css - 你将如何优化这个 CSS?也许使用 SASS 或变量
- c# - 更新 mongocharpdriver nuget
- python - PyQt5从子窗口关闭父窗口和子窗口
- kubernetes - 使用 kubernetes 服务帐户连接到外部 hashcorp vault 时登录未授权错误
- mapbox - 使用 Mapbox API Geocoder Marker 的函数/事件
- jenkins - 无法在空对象上调用方法 getSidsForRole()
- python - Go buildmode 选项不生成头文件
- python-3.x - 无法使用子进程模块检索 docker 容器中存在的文件