レコードに関するさまざまなユーザー定義データポイントをXML列に格納するアプリケーションがあります。これらがどのように保存または更新されるかは、私には制御できません。
列をクエリすると、3つの値のいずれかが返されます。
$ 64質問 xpathを使用して、空の文字列をnullとして返したいのですが。
Nullを空の文字列として返すことに関する多くの答えを見つけましたが、この方法では何も起こりません。
それらは、誰かが値を削除したときにそのようになり、タグを削除する代わりに、<value />
鬼ごっこ。 nullは、値が設定されていない場合に発生します。 xsi:nilは含まれていません。
私はケースステートメントでそれをしました:
select
so.SalesOrderId,
Case
when sopc.value('(Value)[1]','smalldatetime') IS null then Null
when sopc.value('(Value)[1]','smalldatetime') ='' then Null
Else sopc.value('(Value)[1]','smalldatetime')
End as sopc
From
SalesOrders so
Outer apply so.CustomColumns.nodes('/CustomColumnsCollection/CustomColumn[Name="ProjCompleted"]') sopc(sopc)
しかし、これは非効率に感じられ、これが唯一の列ではないため、コードが長くなり、保守が難しくなります。
サンプルデータを含むように編集
SalesOrderId CustomColumns
SO 1 "<CustomColumnsCollection>
<CustomColumn>
<Name>ProjCompleted</Name>
<DataType>1</DataType>
<Value />
</CustomColumn>
</CustomColumnsCollection>"
SO 2 "<CustomColumnsCollection>
<CustomColumn>
<Name>ProjCompleted</Name>
<DataType>1</DataType>
<Value>'2017-11-21'</Value>
</CustomColumn>
</CustomColumnsCollection>"
SO 3 "<CustomColumnsCollection>
</CustomColumnsCollection>"
**Output**
Current Desired
'' null
2017-11-21 2017-11-21
null null
前もって感謝します。
Value
要素内でtext()
ノードを指定します。空のタグがある場合、そのノードはありません。
これを試して:
_declare @X xml;
set @X = '<Value/>';
select @X.value('(Value/text())[1]', 'smalldatetime'),
@X.value('(Value/text())[1]', 'varchar(max)'),
@X.value('(Value/text())[1]', 'int'),
@X.value('(Value)[1]', 'smalldatetime'),
@X.value('(Value)[1]', 'varchar(max)'),
@X.value('(Value)[1]', 'int');
_
結果:
_------------------- ---------- ----------- ----------------------- ---------- -----------
NULL NULL NULL 1900-01-01 00:00:00 0
_
一般に、常にtext()
ノードを指定することをお勧めします。クエリプランはより単純で効率的です。