当使用 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返回NULL而不是空
SELECT N.value('stringvalue[1]', 'varchar(100)') AS stringvalue,
N.value('intvalue[1]', 'int') AS intvalue,
N.value('@attrval', 'varchar(100)') AS attrval
FROM @val.nodes('//record') as T(N)
这是你要找的吗:
SELECT NULLIF(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)
使用 NULLIF(表达式,表达式),其中第一个表达式是从数据返回的表达式,第二个表达式是要与之进行比较的表达式,如果相等,它将返回 NULL。