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

コンマ区切りの文字列をSQLサーバーの複数の列に変換する

    これが SQL Fiddle で動作していることを確認できます:http://sqlfiddle.com/#!3/ 8c3ee/32

    要点は次のとおりです:

    with parsed as (
      select
      commasepa,
      root.value('(/root/s/col[@name="X"])[1]', 'varchar(20)') as X,
      root.value('(/root/s/col[@name="Y"])[1]', 'varchar(20)') as Y,
      root.value('(/root/s/col[@name="Z"])[1]', 'varchar(20)') as Z,
      root.value('(/root/s/col[@name="A"])[1]', 'varchar(20)') as A,
      root.value('(/root/s/col[@name="B"])[1]', 'varchar(20)') as B,
      root.value('(/root/s/col[@name="C"])[1]', 'varchar(20)') as C,
      root.value('(/root/s/col[@name="D"])[1]', 'varchar(20)') as D
    FROM
    (
    select
       commasepa,
       CONVERT(xml,'<root><s><col name="' + REPLACE(REPLACE(COMMASEPA, '=', '">'),',','</col></s><s><col name="') + '</col></s></root>') as root
    FROM
      samp
    ) xml
    )
    update 
      samp
      set
      samp.x = parsed.x,
      samp.y = parsed.y,
      samp.z = parsed.z,
      samp.a = parsed.a,
      samp.b = parsed.b,
      samp.c = parsed.c,
      samp.d = parsed.d
    from
      parsed
    where
      parsed.commasepa = samp.commasepa;
    

    完全開示 - 私は sqlfiddle.com の作成者です

    これは、最初に各コンマセパ文字列を次のような XML オブジェクトに変換することによって機能します:

    <root>
     <s>
      <col name="X">1</col>
     </s>
     <s>
      <col name="Y">2</col>
     </s>
      ....
    </root>
    

    その形式の文字列を取得したら、SQL Server 2005 (およびそれ以降) がサポートする xquery オプションを使用します。これは .value('(/root/s/col[@name="X"])[1]', 'varchar(20)') 部。可能性のある各列を個別に選択するため、使用可能な場合は正規化されて入力されます。その正規化された形式で、「解析済み」と呼ばれる共通テーブル式 (CTE) を使用して結果セットを定義します。次に、この CTE を update ステートメントに結合して元のテーブルに値を入力できるようにします。



    1. ネストされたテーブルに RowId 値を含める

    2. 複数の行からの文字列を1つの列に連結+ 1つのクエリで内部結合する方法

    3. C用の標準のmysql接続プールライブラリはありますか?

    4. このMysqlの単純なクエリを最適化する方法