2016-10-31 15 views
3

値が存在しない場合に表示するXMLタグを取得しようとしています。 XMLタグは、XMLスキーマファイルでは必須です。しかし、ある場合には、このElement(タグ)の値は存在しません。実際のOracle11g SQL文は次のとおりです(データベース値が9999999999以外)。このOracle XML SQL問合せは、他のXML SQLに埋め込まれています。私はXMLのタグは以下のように表示するようになるだろうどのようにNULL値で表示するSQL XMLタグの取得

、おかげで事前に

<ProdId> 
    <idType></idType> 
    <id></id> 
</ProdId> 

SELECT XMLELEMENT ("prodId", 
        XMLELEMENT ("idType",NVL(x.idType,'N/A')), 
        XMLELEMENT ("id",NVL(x.id,'N/A')) 
       ) 
from 
    (SELECT DECODE (alternative_creation_ids.gc_alt_usage_id_type_code,'PROD',1, 
               'ISAN',2, 
               'CUI',3,9) AS oderby, 
      DECODE(alternative_creation_ids.gc_alt_usage_id_type_code,'PROD','SOCIETY-ID', 
                     'ISAN','ISAN', 
                     'CUI','CLOCKID','N/A') AS idType, 
                    alternative_creation_ids.alternative_creation_id AS id, 
                    alternative_creation_ids.cre_surr_id AS cre_surr_id             
    FROM alternative_creation_ids 
    WHERE alternative_creation_ids.gc_alt_usage_id_type_table = 'AUIT' 
    AND alternative_creation_ids.gc_alt_usage_id_type_code in ('ISAN','CUI','PROD') 
    order by 1) x 
WHERE x.cre_surr_id = 9999999999999 

表の構造は以下です。

CREATE TABLE ALTERNATIVE_CREATION_IDS 
(
    ALTERNATIVE_CREATION_ID  VARCHAR2(100 BYTE) NOT NULL, 
    CRE_SURR_ID     NUMBER(12)  NOT NULL, 
    TP_SURR_ID     NUMBER(12), 
    GC_ALT_USAGE_ID_TYPE_TABLE VARCHAR2(5 BYTE) DEFAULT 'AUIT'    NOT NULL, 
    GC_ALT_USAGE_ID_TYPE_CODE VARCHAR2(5 BYTE) NOT NULL, 
    SOC_SURR_ID     NUMBER(12), 
    SURR_ID      NUMBER(12)  NOT NULL) 

以下のデータがあります。

--SQL Statement which produced this data: 
-- 
-- select * from alternative_creation_ids where surr_id in (5068066723, 
-- 5068066724, 
-- 5068066725, 
-- 5068066726, 
-- 5068066727, 
-- 5068066729, 
-- 5068066731, 
-- 5068066732, 
-- 5068066733); 
-- 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('4YvUOe8q9N2kQ5aflrezTs', 4890969424, 9513, 'AUIT', 'PROD', 
    NULL, 5068066723); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('5GgVV6DFbWofT50C0dMRl0', 4891029626, 9513, 'AUIT', 'PROD', 
    NULL, 5068066724); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('4YyWUP4TOLM0lLKgbxXens', 4890969425, 9513, 'AUIT', 'PROD', 
    NULL, 5068066725); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('5Gh2ldlMcEjcxGXQZO2erc', 4891029627, 9513, 'AUIT', 'PROD', 
    NULL, 5068066726); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('5GhltgxuEfhzPiBxOoMKdl', 4891029628, 9513, 'AUIT', 'PROD', 
    NULL, 5068066727); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('3JfOCUI9q8yb3lJdEJPPbE', 4890969284, 9513, 'AUIT', 'PROD', 
    NULL, 5068066729); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('5GjwMbQWxB97ddPnqDAUt8', 4891029629, 9513, 'AUIT', 'PROD', 
    NULL, 5068066731); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('5GjLSJ14WJlRSUe4MNoNLE', 4891029630, 9513, 'AUIT', 'PROD', 
    NULL, 5068066732); 
Insert into ALTERNATIVE_CREATION_IDS 
    (ALTERNATIVE_CREATION_ID, CRE_SURR_ID, TP_SURR_ID, GC_ALT_USAGE_ID_TYPE_TABLE, GC_ALT_USAGE_ID_TYPE_CODE, 
    SOC_SURR_ID, SURR_ID) 
Values 
    ('5GjSKGaNJzhVlL9ygkyNbY', 4891029631, 9513, 'AUIT', 'PROD', 
    NULL, 5068066733); 
COMMIT; 

正解はAlex Pooleさんでした。ちょうどあなたの情報のために、私は下のXML SQLに行きました。私は空白の値だけを表示するようにタグを取得しようとしましたが、これまでの理由で終了タグが示されました(下記参照)。

<ProdId> 
    </Idtype> 
    </id> 
</ProdId> 

はので、代わりに私は、テーブル内のデータがない場合は、既存のクエリが空のタグを生成することはできません

<ProdId> 
    <Idtype>N/A</Idtype> 
    <id>N/A</id> 
</ProdId> 



,(  -- start level 5 tag prodId               
    SELECT XMLELEMENT ("prodId", 
         XMLELEMENT ("idType",x.idType), 
         XMLELEMENT ("idType",x.id)) 
    from 
     (SELECT DECODE (alternative_creation_ids.gc_alt_usage_id_type_code,'PROD',1, 
             'ISAN',2, 
             'CUI',3,9) AS oderby, 
       DECODE (alternative_creation_ids.gc_alt_usage_id_type_code,'PROD','SOCIETY-ID', 
             'ISAN','ISAN', 
             'CUI','CLOCKID','N/A') AS idType, 
       alternative_creation_ids.alternative_creation_id AS id, 
       alternative_creation_ids.cre_surr_id AS cre_surr_id             
     FROM alternative_creation_ids 
     WHERE alternative_creation_ids.gc_alt_usage_id_type_table = 'AUIT' 
     AND alternative_creation_ids.gc_alt_usage_id_type_code in ('ISAN','CUI','PROD') 
     order by 1) x              
     WHERE x.cre_surr_id = cre.surr_id 
     UNION ALL 
     SELECT XMLELEMENT ("prodId", 
        XMLELEMENT ("idType",'N/A'), 
        XMLELEMENT ("id",'N/A') 
         ) 
     FROM dual 
     WHERE NOT EXISTS (SELECT null FROM alternative_creation_ids 
         WHERE cre_surr_id = cre.surr_id) 
    ) -- end level 5 tag prodId 
+1

テーブル構造とサンプルデータを追加して、空白のタグを生成できますか? –

+0

ホープ、これがアレックス・ポールを助ける –

答えて

1

のために行ってきました。あなたはIDが存在するかどうかをチェックする、それらを生成するために労働組合を追加することができます。

... 
WHERE x.cre_surr_id = 9999999999999 
UNION ALL 
SELECT XMLELEMENT ("prodId", 
        XMLELEMENT ("idType",null), 
        XMLELEMENT ("id",null) 
       ) 
FROM dual 
WHERE NOT EXISTS (
    SELECT null FROM alternative_creation_ids WHERE cre_surr_id = 9999999999999 
); 

XMLELEMENT("PRODID",XMLELEMENT("IDTYPE",NVL(X.IDTYPE,'N/A')),XMLELEMENT("ID",NVL 
-------------------------------------------------------------------------------- 
<prodId><idType></idType><id></id></prodId> 

あなたがそれにフィルターを促進し(最後まで順番-by文節を移動する場合にも、あなたのインライン・ビュー内の組合を行うことができます

SELECT XMLELEMENT ("prodId", 
        XMLELEMENT ("idType",NVL(x.idType,'N/A')), 
        XMLELEMENT ("id",NVL(x.id,'N/A')) 
       ) 
FROM 
    (SELECT DECODE (alternative_creation_ids.gc_alt_usage_id_type_code,'PROD',1, 
               'ISAN',2, 
               'CUI',3,9) AS oderby, 
      DECODE(alternative_creation_ids.gc_alt_usage_id_type_code,'PROD','SOCIETY-ID', 
                     'ISAN','ISAN', 
                     'CUI','CLOCKID','N/A') AS idType, 
                    alternative_creation_ids.alternative_creation_id AS id, 
                    alternative_creation_ids.cre_surr_id AS cre_surr_id             
    FROM alternative_creation_ids 
    WHERE alternative_creation_ids.gc_alt_usage_id_type_table = 'AUIT' 
    AND alternative_creation_ids.gc_alt_usage_id_type_code in ('ISAN','CUI','PROD') 
    AND cre_surr_id = 9999999999999 
    UNION ALL 
    SELECT null, null, null, null 
    FROM dual 
    WHERE NOT EXISTS (
     SELECT null FROM alternative_creation_ids WHERE cre_surr_id = 9999999999999) 
    ) x 
ORDER BY oderBy 
/

XMLELEMENT("PRODID",XMLELEMENT("IDTYPE",NVL(X.IDTYPE,'N/A')),XMLELEMENT("ID",NVL 
-------------------------------------------------------------------------------- 
<prodId><idType>N/A</idType><id>N/A</id></prodId> 

...しかし、それはあなたが望むようには見えませんNVL取り扱いを、ピックアップ:;それは)サブクエリの内側にそれを持ってしても意味がありません。

+0

アレックス・ポールあなたの男... –

関連する問題