sql - 获取 SQL XML 标记以显示 NULL 值

标签 sql xml oracle

我正在尝试让 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>

如果将过滤器提升到内联 View 中(并将 order-by 子句移到末尾;将它放在子查询中没有意义),您也可以在内联 View 中执行联合:

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 处理。

关于sql - 获取 SQL XML 标记以显示 NULL 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40340325/

相关文章:

php - 如果数据库中的 url 匹配,如何将字符串 "name"分配并输出到 PHP 中的 $query

xml - MSXML VBA : Validating XML against XSD: "The ' ' namespace provided differs from the schema's targetNamespace.“

php - 如何从 magento 1 模板调用 block 方法

linux - 更改本地操作系统时间会影响数据库吗?

sql - 姓名查询数据库建议

sql - 计算select语句中的记录页数

php - 如何连接多个表以根据给定条件获取结果?

java - 数据库错误: Vendor 20

mysql - 多个表的减法 - sql

xml - 用于 Perl 的 XSLT2.0 处理器?