编辑:我通过将属性与元素混淆来证明我的无知,我更新了我的问题。对不起。为了澄清,我正在寻找元素代码的存在:
<conditionmessage:code>MYCODE</conditionmessage:code>
我有一堆模式,其中有一个包含 XML 列的表。每列都有一些 XML 索引。我很确定 SQL 模式之间的 XML 模式不同,但是,每个模式中都存在相同的 XML 索引。我怀疑复制/粘贴,我似乎无法找到 XML 模式的任何文档。所以我想到了一种更实用的方法,即遍历 XML 列并检查每个元素是否存在。这些表格已经存在了一段时间,所以现在所有可能的元素都应该在那里。
现在的问题是,无论价值如何,检查元素是否存在的最佳方法是什么?不幸的是,我的大脑与 XPATH/XQUERY 不兼容,每次我都必须努力让自己相信查询完成了它应该做的事情。我目前的方法似乎有效,但我很好奇是否有更好的方法。最小表的基数约为 100.000 行,最大的表约为 100.000.000 行:
import ibm_db
import ibm_db_dbi
...
conn = ibm_db_dbi.connect("...")
c1 = conn.cursor()
for schema in [ "S1", "S2", ... ]:
for attribute in [ "a1", "s2", ...]:
sql = f"""
select * from {schema}.ATOM_ENTRY
WHERE XMLEXISTS('$d//*:{attribute}[fn:matches(text(), $p, "i")]'
PASSING ENTRY_XML AS "d", CAST('\S*' AS VARCHAR(128)) as "p")
fetch first 1 rows only
optimize for 1 rows"""
c1.execute(sql)
exists = False
for row in c1.fetchall():
exists = True
print(f"{schema}.ATOM_ENTRY -> {attribute} : {exists}")
尝试这个:
对于属性
结果是:
对于具有命名空间的元素
结果是: