2

categoryid空でない場合にのみノードと値を表示したいguid。さまざまな形式を試しましたが、何も機能しませんでした。結果に if ステートメントを文字列として出力し続けます。コードの一部としてelse条件が必要だと読みましたが、そこに空を入れてstringもいいですか? これについてオンラインでいくつかの記事とmsdnリファレンスを調べましたが、うまくいきませんでした。何らかの理由で、それは私のif発言を評価しています。

declare @XML xml = N'
<books>
    <book>
        <title>Book 1</title>
        <categoryid>00000000-0000-0000-0000-000000000000</categoryid>
        <author>Chris</author>
        <price>10</price>
    </book>   
    <book>
        <title>Book 2</title>
        <categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid>
        <author>Spencer</author>
        <price>20</price>
    </book>
</books>';


select @XML.query(
'<books>
    {
        for $b in /books/book
            return 
            <book>
                {$b/title}
                {$b/price}
                if(not($b/categoryid = 00000000-0000-0000-0000-000000000000)) 
                    then {$b/categoryid}
                else 

            </book>
    }
</books>'
);
4

1 に答える 1

2

2つの問題があったと思います。

1 - 「if」の前と「else」の後に、条件付きブロックを中かっこで囲む必要がありました。

2 - 空の GUID 値はそれ自身の変数である必要がありました - 条件内ではそれを文字列として扱っていたと思います。

また、「not」演算子を期待どおりに動作させるのに問題があったため、条件を逆にしてその問題を回避しました。

declare @XML xml = N'
<books>
    <book>
        <title>Book 1</title>
        <categoryid>00000000-0000-0000-0000-000000000000</categoryid>
        <author>Chris</author>
        <price>10</price>
    </book>   
    <book>
        <title>Book 2</title>
        <categoryid>DF3D696D-B7A3-44A2-BC7D-1D45745C979B</categoryid>
        <author>Spencer</author>
        <price>20</price>
    </book>
</books>';

declare @emptyguid uniqueidentifier = '00000000-0000-0000-0000-000000000000'

select @XML.query('
<books>
  {
  for $b in /books/book
    return
      <book>
        {$b/title}
        {$b/price}
        {
          if($b/categoryid = sql:variable("@emptyguid")) then
            ()
          else (
            $b/categoryid
          )
        }
      </book>
  }
</books>
');
于 2017-02-07T14:15:15.187 に答える