【问题标题】:SQL query XML and return null if node is not existing [duplicate]如果节点不存在,SQL 查询 XML 并返回 null [重复]
【发布时间】:2022-01-04 06:37:24
【问题描述】:

我有一个节点 (field2) 并不总是存在的 xml 文件。如果节点不存在,我想获得空值。

SELECT 
    field1, field2 
FROM 
    (SELECT DISTINCT 
         xmlField1.value('text()[1]','VARCHAR(256)') AS field1, 
         xmlField2.value('text()[1]','VARCHAR(256)') AS field2 
     FROM 
         [dbo].XMLTable t 
     CROSS APPLY 
         [XMLData].nodes('/collection/test/field1') A(xmlField1)
     CROSS APPLY 
         [XMLData].nodes('/collection/test/field2') B(xmlField2)) xmlData

如果我在 XML 文件中有两个字段,则此查询有效,但如果缺少 field2,则不会返回任何值。

【问题讨论】:

  • 我没有使用 T-SQL 的经验,但是使用 PLSQL 并且出现了同样的问题。我所做的是,当值为 null 时,我只需将其替换为注释即可。
  • …OUTER APPLY [XMLData].nodes('/collection/test/field2') B…dbfiddle.uk/…
  • 旁白:切碎.nodes('/collection/test') 然后使用.value('field1/text()[1]' 可能更容易且性能更高,因为这只需要一个.nodes
  • 提问时,您需要提供minimal reproducible example: (1) DDL 和样本数据填充,即 CREATE 表和 INSERT T-SQL 语句。 (2) 你需要做什么,即逻辑和你的代码尝试在 T-SQL 中实现它。 (3) 期望的输出,基于上述#1 中的样本数据。 (4) 您的 SQL Server 版本 (SELECT @@version;)。

标签: sql sql-server xml xquery


【解决方案1】:

没有提供最小的可重现示例。

请尝试以下概念示例。

SQL

-- DDL and sample data population, start
DECLARE @tbl TABLE  (ID INT IDENTITY(1,1) PRIMARY KEY, xmldata XML);
INSERT INTO @tbl (xmldata) VALUES
(N'<collection>
    <test>
        <field1>fld11</field1>
        <field2>fld12</field2>
    </test>
    <test>
        <field1>fld12</field1>
    </test>
    <test>
        <field1>fld13</field1>
        <field2/>
    </test>
</collection>');
-- DDL and sample data population, end

SELECT ID
    , c.value('(field1/text())[1]','VARCHAR(256)') AS field1
    , c.value('(field2/text())[1]','VARCHAR(256)') AS field2
FROM @tbl
    CROSS APPLY xmldata.nodes('/collection/test') AS t(c);

输出

+----+--------+--------+
| ID | field1 | field2 |
+----+--------+--------+
|  1 | fld11  | fld12  |
|  1 | fld12  | NULL   |
|  1 | fld13  | NULL   |
+----+--------+--------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    相关资源
    最近更新 更多