sql >> データベース >  >> RDS >> Oracle

Oracleでxmlパスとして入力を渡して結果をプルできません

    XML内のIDでフィルタリングしようとしていると仮定すると、構文に問題があります。ルートノードをActivityではなくActivityIdとして指定し、IDノードに移動せず、誤用していますcontains -そしてそれはおそらくあなたが望むものではありません。名前空間を無視しています。

    これは、XMLが特定の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;
    

    ただし、ExtractValueは長い間非推奨になっているため、代わりにXMLQueryを使用する必要があります。または、このコンテキストでは、埋め込みたい値を使用してXMLExistsを使用する方がおそらく理にかなっています:

    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
    );
    

    または、おそらくもっと便利に引数として提供されます:

    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<>フィドル

    次に、一致する行のXMLから特定のデータを抽出する場合は、XMLQueryまたはXMLTableを調べますが、これは別の問題です。




    1. 大きなテーブルで完全に重複する行を確認します

    2. 階層型MySQLクエリのヘルプが必要

    3. ストップワードを考慮しない完全な検索インデックスクエリを作成するにはどうすればよいですか?

    4. エイリアスをまとめて作成しますか?