繁体   English   中英

使SQL值标记显示为NULL值

[英]Getting SQL XML tags to show with NULL values

我正在尝试获取XML标记,以显示是否存在任何值。 XML标记在XML模式文件中是必需的。 但在某些情况下,此元素(标记)的值不存在。 实际的Oracle11g SQL语句如下(但非数据库值为9999999999)。 此Oracle XML SQL查询嵌入在其他XML 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   

如果表中没有数据,则现有查询无法生成空标记。 您可以添加联合以生成它们,检查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>

如果将过滤器升级到内联视图中,也可以在内联视图中执行联合(并将order-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处理。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM