4

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

4

2 回答 2

2
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)
于 2011-05-22T17:25:40.230 回答
1

这是你想要的:

   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 ( expression , expression ),其中第一个表达式是从数据返回的表达式,第二个是与之比较的表达式,如果相等,它将返回 NULL。

于 2011-05-13T14:33:20.253 回答