sql >> Databáze >  >> RDS >> Oracle

Nelze získat výsledky předáním vstupu jako xml cestu v oracle

Za předpokladu, že se pokoušíte filtrovat ID v XML, máte problém se syntaxí, zadali jste kořenový uzel jako ActivityId namísto Activity, nesměřujete dolů k ID uzlu, zneužíváte contains - a to pravděpodobně stejně není to, co chcete; a ignorujete jmenné prostory.

Tím se najdou pouze řádky, kde má XML konkrétní ID:

SELECT * from activity
where ExtractValue(xml,
  '/Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID/text()',
  'xmlns="urn:astrazeneca:na:Activity:domain:3" xmlns:ns2="urn:astrazeneca:na:CommonTypes:domain:2"'
  ) = 10669;

Ale ExtractValue je již dávno zastaralý, takže byste místo něj měli použít XMLQuery. Nebo v tomto kontextu by pravděpodobně dávalo větší smysl použít XMLExists s hodnotou, kterou chcete vložit:

SELECT * from activity
where XMLExists('
    declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
    declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
    /Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=10669]
  '
  passing xml
);

nebo možná užitečněji dodané jako argument:

SELECT * from activity
where XMLExists('
    declare default element namespace "urn:astrazeneca:na:Activity:domain:3";
    declare namespace ns2="urn:astrazeneca:na:CommonTypes:domain:2";
    /Activity/Agent/Territory/ns2:SalesTeamId/ns2:ID[text()=$id]
  '
  passing xml, 10669 as "id"
);

db<>housle

Pokud pak chcete extrahovat konkrétní data z XML v odpovídajících řádcích, podívejte se na XMLQuery nebo XMLTable – ale to je samostatný problém.




  1. Změňte všechny tabulky v databázi

  2. sekvenční sumace dotazů Oracle na řádky

  3. Jak vypočítat druhou odmocninu v SQL

  4. Proč se pro tento dotaz nepoužívá index NLSSORT?