当使用 xquery 值运算符从 xml 属性中获取值时,缺少的属性将返回为 null。有没有办法在不求助于的情况下做同样的事情CASE WHEN N.exists('path')=0 THEN NULL ELSE n.value('path') END
?
这个 SQL:
DECLARE @val xml
SET @val = '<records>
<record attrval="attrval">
<stringvalue>some value</stringvalue>
<intvalue>1</intvalue>
</record>
<record>
<intvalue>1</intvalue>
</record>
<record>
<stringvalue>another value</stringvalue>
</record>
</records>'
SELECT N.query('stringvalue').value('/', 'varchar(100)') AS stringvalue,
N.query('intvalue').value('/', 'int') AS intvalue,
N.value('@attrval', 'varchar(100)') AS attrval
FROM @val.nodes('//record') as T(N)
结果是:
[stringvalue] [intvalue] [attrval]
some value 1 attrval
1 NULL
another value 0 NULL
我想得到:
[stringvalue] [intvalue] [attrval]
some value 1 attrval
NULL 1 NULL
another value NULL NULL
不做:
SELECT CASE WHEN N.exists('stringvalue')=1 THEN N.query('stringvalue').value('/', 'varchar(100)') ELSE NULL END AS stringvalue,
CASE WHEN N.exists('intvalue')=1 THEN N.query('intvalue').value('/', 'int') ELSE NULL END AS intvalue,
N.value('@attrval', 'varchar(100)') AS attrval
FROM @val.nodes('//record') as T(N)
请注意,在这种情况下,我不能只使用属性值,因为 SQL Server 对属性的长度有限制,而我的一些数据超出了这个限制。
另外,还有一个相关的问题,但答案不适用,因为我需要区分空和缺失:SQL Server xQuery return NULL 而不是 empty