EDIT: demonstrei minha ignorância confundindo atributo com elemento, atualizei minha pergunta. Desculpe. Para esclarecer, estou procurando a existência do código do elemento em:
<conditionmessage:code>MYCODE</conditionmessage:code>
Eu tenho um monte de esquemas onde há uma tabela que contém uma coluna XML. Há alguns índices XML em cada coluna. Tenho certeza de que os esquemas XML diferem entre os esquemas SQL, no entanto, os mesmos índices XML existem em cada esquema. Suspeito copiar/colar e não consigo encontrar nenhuma documentação para os esquemas XML. Então, pensei em uma abordagem mais pragmática, ou seja, percorrer as colunas XML e verificar se cada elemento existe ou não. As tabelas já existem há algum tempo, então todos os elementos possíveis já devem estar lá.
Agora, a pergunta, qual é a melhor maneira de verificar a existência de um elemento, independentemente do valor? Infelizmente, meu cérebro é incompatível com XPATH/XQUERY, e tenho que lutar sempre para me convencer de que a consulta faz o que deveria fazer. Minha abordagem atual parece funcionar, mas estou curioso para saber se existe uma maneira melhor. A cardinalidade da menor tabela é ~ 100.000 linhas e a maior ~ 100.000.000 linhas:
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}")
Tente isto:
Para atributos
O resultado é:
Para elementos com namespaces
O resultado é: