4

xquery value演算子を使用して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によって課される属性の長さに制限があり、一部のデータがそれを超えるため、属性値だけを使用できないことに注意してください。

また、関連する質問がありますが、空と欠落を区別する必要があるため、答えは当てはまりません。SQLServerxQueryは空ではなくNULLを返します

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 ( 式 , 式 ) を使用します。最初の式はデータから返される式で、2 番目の式はそれと比較する式であり、等しい場合は NULL を返します。

于 2011-05-13T14:33:20.253 に答える