sql server - 在 SQL XQuery 结果集中,有没有办法使 "value" 运算符在缺少的元素上返回 null?



当使用 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。

最新更新