【问题标题】:SQL “For XML Path” - multiple nested results with null typeSQL “For XML Path” - 具有空类型的多个嵌套结果
【发布时间】:2017-03-03 11:22:39
【问题描述】:

我将为我需要的一个简单示例制作一个块代码

select      
    (   select
                (Select
                    (Select             
                            NULLIF (t1.number,2) as 'e'
                    FOR XML PATH('d'),type
                    ) 
                FOR XML PATH('c'),type
                ) 
        FOR XML PATH('b1'), type
    ) ,
    t1.number as 'b2'
from
(select 1 as number union all select 2 as number union all select 3 as number) as t1
FOR XML PATH(''), 
ROOT('a')

并通过此代码获得:

<a>
  <b1>
    <c>
      <d>
        <e>1</e>
      </d>
    </c>
  </b1>
  <b2>1</b2>
  <b1>
    <c>
      <d />
    </c>
  </b1>
  <b2>2</b2>
  <b1>
    <c>
      <d>
        <e>3</e>
      </d>
    </c>
  </b1>
  <b2>3</b2>
</a>

但我想在数字为 2 时获取 c 和 d 和 d 元素不显示 (记住这是一个更复杂的查询的例子)

我想得到什么:

<a>
  <b1>
    <c>
      <d>
        <e>1</e>
      </d>
    </c>
  </b1>
  <b2>1</b2>
  </b1>
  <b2>2</b2>
  <b1>
    <c>
      <d>
        <e>3</e>
      </d>
    </c>
  </b1>
  <b2>3</b2>
</a>

【问题讨论】:

  • 想要获取的 XML 无效...请修复此问题并提供有关您需求的一些背景信息。 T
  • 你说得对,在 "as t1" 复制粘贴问题之前有一个 >,谢谢,现在已更正。
  • 不,这个错误很容易检测(和修复)。您在 想要获取 部分中发布的 XML 无效(我猜&lt;/b1&gt; 放错了位置)
  • 只需更改为 而不是仅 1>,我不知道为什么,但该 xml 是我发布的查询的响应。

标签: sql-server xml tsql path null


【解决方案1】:

我的魔法水晶球告诉我——最终——你正在寻找这个:

select
    CASE WHEN t1.number<>2 THEN      
    (   select
                (Select
                    (Select             
                            t1.number 'e'
                    FOR XML PATH('d'),type
                    ) 
                FOR XML PATH('c'),type
                ) 
        FOR XML PATH('b1'), type
    ) END,
    t1.number as 'b2'
from
(select 1 as number union all select 2 as number union all select 3 as number) as t1
FOR XML PATH(''), 
ROOT('a')

结果

<a>
  <b1>
    <c>
      <d>
        <e>1</e>
      </d>
    </c>
  </b1>
  <b2>1</b2>
  <b2>2</b2>
  <b1>
    <c>
      <d>
        <e>3</e>
      </d>
    </c>
  </b1>
  <b2>3</b2>
</a>

更新:一个猜测......

select
    ISNULL(CASE WHEN t1.number<>2 THEN      
    (   select
                (Select
                    (Select             
                            t1.number 'e'
                    FOR XML PATH('d'),type
                    ) 
                FOR XML PATH('c'),type
                ) 
        FOR XML PATH(''), type
    ) END,'') AS b1,
    t1.number as 'b2'
from
(select 1 as number union all select 2 as number union all select 3 as number) as t1
FOR XML PATH(''), 
ROOT('a')

返回

<a>
  <b1>
    <c>
      <d>
        <e>1</e>
      </d>
    </c>
  </b1>
  <b2>1</b2>
  <b1></b1>
  <b2>2</b2>
  <b1>
    <c>
      <d>
        <e>3</e>
      </d>
    </c>
  </b1>
  <b2>3</b2>
</a>

【讨论】:

  • 谢谢伙计,我只是简化了查询,并以 NULLIF (t1.number,2) 为例,在那里有 null。这不能解决我的问题。我想要的是当我在该类型中得到 nill 并且在该类型或上层类型中没有行时,该元素不会显示。
  • @Armando 预期的输出——正如你现在所展示的——是不正确的。我怎么知道你需要什么。我的输出究竟有什么问题?
  • 因为这里的解决方案(CASE WHEN t1.number2 THEN)对于这个简单的例子来说很明显,但问题是当我在子查询中没有行时(在嵌套在 2nn 的 xml 路径中或第三级)。我知道一个解决方案,如果我输入“NULLIF (t1.number,2) is not null 它会起作用,例如:更改为 (Select (Select NULLIF (t1.number,2) as 'e' where NULLIF (t1.number, 2) is not null FOR XML PATH('d'),type ) where NULLIF (t1.number,2) is not null FOR XML PATH('c'),type ) c 和 d 路径。
  • @Armando 老实说:你的解释——至少对我来说——绝对不清楚。我的尝试纯属猜测...不过我发布了一个新的猜测,请检查我的 UPDATE。请阅读How to ask a good SQL questionHow to create a MCVE
  • 感谢您的努力,我对您的解决方案的问题是您认为您知道元素何时变为空,然后您放置一个案例(t1.number2),但那是因为我举个简单的例子。我需要一个解决方案,只更改生成 元素的选择和 FOR XML PATH('b1') 之间的代码,类型
猜你喜欢
  • 1970-01-01
  • 2014-11-04
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-06
  • 1970-01-01
相关资源
最近更新 更多