PostgreSQL中XPath1日期对比失效问题求助
问题解决:PostgreSQL中XPath日期筛选失效的原因及修复
你的XPath查询失效的根本原因不是日期字符串对比逻辑,而是XML命名空间未正确绑定。PostgreSQL的xpath_exists函数默认不会自动识别XML中的命名空间前缀(比如val:),所以//val:key根本无法匹配到任何节点,自然不会返回预期结果。
方案1:指定命名空间绑定(推荐)
在xpath_exists的第三个参数中传入命名空间映射,让PostgreSQL识别val前缀对应的URI:
SELECT id, document FROM xml_data WHERE xpath_exists( '//val:key[substring(@modifiedDate, 1, 10) > "2024-06-06"]', document, ARRAY[ARRAY['val', 'http://some.uri']] );
方案2:绕过命名空间前缀(适用于简单场景)
如果不想指定命名空间,也可以用local-name()函数匹配节点的本地名称,同时保留日期字符串对比逻辑:
SELECT id, document FROM xml_data WHERE xpath_exists( '//*[local-name()="key" and substring(@modifiedDate, 1, 10) > "2024-06-06"]', document );
验证说明
执行以上任一查询,都会返回包含Key1(2024-06-07)和Key3(2024-06-10)的XML文档,符合预期。你的日期字符串对比逻辑本身是有效的——ISO格式的日期(YYYY-MM-DD)按字符串字典序对比和日期大小对比结果一致,取前10位即可正确筛选。
内容的提问来源于stack exchange,提问作者The6thSense
相关产品推荐
相关产品推荐

