sql >> データベース >  >> RDS >> Sqlserver

SQLServer2008テーブルのXMLフィールドからの属性の抽出

    質問を投稿した直後に、この回答 。以前の検索で見つからなかった理由がわかりません。それが私が探していた答えでした。機能するクエリは次のとおりです。

    クエリ

    select Name
          ,xml_data.value('(/data/info/@x)[1]', 'int') as [Info.x]
          ,xml_data.value('(/data/info/@y)[1]', 'int') as [Info.y]
          ,xml_data.value('(/data/info/.)[1]', 'varchar(10)') as [Info]
    from   #temp
    

    結果

    Name     Info.x    Info.y    Info
    -------  --------  --------  ---------
    one         42        99     Red
    two         27        72     Blue
    three       16        51     Green
    four        12        37     Yellow
    

    ------編集[2014-01-29]------

    この回答に追加する価値のある別のケースを見つけました。複数の<info>が与えられた <data>内の要素 要素の場合、すべての<info>を返すことができます cross applyを使用したノード :

    create table #temp (id int, name varchar(32), xml_data xml)
    
    insert into #temp values
    (1, 'one',   '<data><info x="42" y="99">Red</info><info x="43" y="100">Pink</info></data>'),
    (2, 'two',   '<data><info x="27" y="72">Blue</info><info x="28" y="73">Light Blue</info></data>'),
    (3, 'three', '<data><info x="16" y="51">Green</info><info x="17" y="52">Orange</info></data>'),
    (4, 'four',  '<data><info x="12" y="37">Yellow</info><info x="13" y="38">Purple</info></data>')
    
    select Name
          ,C.value('@x', 'int') as [Info.x]
          ,C.value('@y', 'int') as [Info.y]
          ,C.value('.', 'varchar(10)') as [Info]
    from #temp cross apply
         #temp.xml_data.nodes('data/info') as X(C)
    
    drop table #temp
    

    この例では、次のデータセットが返されます。

    Name      Info.x      Info.y      Info
    --------- ----------- ----------- ----------
    one       42          99          Red
    one       43          100         Pink
    two       27          72          Blue
    two       28          73          Light Blue
    three     16          51          Green
    three     17          52          Orange
    four      12          37          Yellow
    four      13          38          Purple
    



    1. SQLDeveloperの問題を伴うPostgreSQL

    2. カンマ区切りの値で列を検索する

    3. MySQLで署名を保存する方法

    4. 行の値に文字列MySQLが含まれるSELECT