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

値と条件に基づくOracleXMLTYPE抽出

    生徒の兄弟に戻ることができますs_days ノード:

    select h.PlanCodeCode, b.amount, b.pcode, b.child1_amount, b.child2_amount
     from   t
        cross join
        xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                 '/SSO_XML'
                 passing t.xml
                 columns PlanCodeCode varchar2(100)  path './PlanCode/@PlanCodeCode',
                         attributes xmltype path './PlanCode'
                ) h
        left join xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                 'PlanCode/S_DAYS/STUDENT/DIVISION'
                 passing h.attributes
                 columns node_level for ordinality
                        , amount number path '@Amount'
                        , pcode  varchar2(10) path './../../@PCODE'
                        , child1_amount number path './../../../S_DAYS[@PCODE="Child1"]/AdditonalFare/AdditonalFareAmount/@Amount'
                        , child2_amount number path './../../../S_DAYS[@PCODE="Child2"]/AdditonalFare/AdditonalFareAmount/@Amount'
                ) b on 1=1;
    

    または、学生ノードがない場合でも常に子を表示したい場合は、最初のXMLTableから子を取得できます。

    select h.PlanCodeCode, b.amount, b.pcode, h.child1_amount, h.child2_amount
     from   t
        cross join
        xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                 '/SSO_XML'
                 passing t.xml
                 columns PlanCodeCode varchar2(100)  path './PlanCode/@PlanCodeCode',
                         attributes xmltype path './PlanCode',
                         child1_amount number path './PlanCode/S_DAYS[@PCODE="Child1"]/AdditonalFare/AdditonalFareAmount/@Amount',
                         child2_amount number path './PlanCode/S_DAYS[@PCODE="Child2"]/AdditonalFare/AdditonalFareAmount/@Amount'
                ) h
        left join xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                 'PlanCode/S_DAYS/STUDENT/DIVISION'
                 passing h.attributes
                 columns node_level for ordinality
                        , amount number path '@Amount'
                        , pcode  varchar2(10) path './../../@PCODE'
                ) b on 1=1;
    

    ちなみに、12cを使用しているので、cross applyを使用できます。 およびouter apply -ダミーのon 1=1を使用した外部結合の代わりに後者 状態。

    select h.PlanCodeCode, b.amount, b.pcode, h.child1_amount, h.child2_amount
     from   t
        cross apply
        xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                 '/SSO_XML'
                 passing t.xml
                 columns PlanCodeCode varchar2(100)  path './PlanCode/@PlanCodeCode',
                         attributes xmltype path './PlanCode',
                         child1_amount number path './PlanCode/S_DAYS[@PCODE="Child1"]/AdditonalFare/AdditonalFareAmount/@Amount',
                         child2_amount number path './PlanCode/S_DAYS[@PCODE="Child2"]/AdditonalFare/AdditonalFareAmount/@Amount'
                ) h
        outer apply xmltable(xmlnamespaces(default 'http://www.w3.org/2001/XMLSchema'),
                 'PlanCode/S_DAYS/STUDENT/DIVISION'
                 passing h.attributes
                 columns node_level for ordinality
                        , amount number path '@Amount'
                        , pcode  varchar2(10) path './../../@PCODE'
                ) b;
    

    これらのいずれも、サンプルデータで同じ結果を取得します:

    PLANCODECODE | AMOUNT | PCODE | CHILD1_AMOUNT | CHILD2_AMOUNT
    :----------- | -----: | :---- | ------------: | ------------:
    CHOICE       | 150.05 | P123  |           100 |           130
    CHOICE       | 250.05 | P123  |           100 |           130
    CHOICE       | 150.05 | P1234 |           100 |           130
    CHOICE       | 250.05 | P1234 |           100 |           130
    

    db <> fiddle




    1. MySQL SELECT LIKEまたはREGEXPは、1つのレコード内の複数の単語に一致します

    2. クロス データベース クエリ、結合の長所と短所

    3. AndroidでAMP(apache mysql php)を実行する

    4. MySQLには、Oracleのレベルのような機能があります。