この問題は、テーブル列内のデータを操作して追加の列を作成する方法を扱います。元の列には、サブスクリプション番号が 1 つの値で格納されます。私たちのタスクは、これらのサブスクリプション番号のさまざまな部分を抽出し、それらを複数の列に分散することです。
創造的なアプローチには、文字列操作と XML 処理を組み合わせて利用することが含まれます。その仕組みは次のとおりです:
サブスクリプション番号内のすべてのスペースをダッシュに置き換え、replace() 関数を使用してダッシュを変換します。特別な区切り文字にするには、「§§Split§§」と言います。これにより、変換された数値を XML 構造として表示できます。
replace(replace(subscription_number, ' ', '-'), '-', '§§Split§§')
変換された数値は次のようになります。
<x>SC-5-1395-174-25P</x>
Cast() 関数を使用して、変換された数値を XML タグでラップし、xDim.value() 関数を使用して個々の部分を抽出します。たとえば、最初の部分 (SC) を取得するには、次を使用します。
ltrim(rtrim(xDim.value('/x[1]', 'varchar(max)')))
クロス適用を使用して、抽出された値を新しい列に割り当てます結果セット内の新しい列。以下に例を示します。
Select A.subscription_number, B.Pos1 as Col1, B.Pos2 as Col2, B.Pos3 as Col3, B.Pos4 as Col4, B.Pos5 as Col5, B.Pos6 as Col6, B.Pos7 as Col7 From table A Cross Apply ( Select Pos1 = ltrim(rtrim(xDim.value('/x[1]', 'varchar(max)'))) , Pos2 = ltrim(rtrim(xDim.value('/x[2]', 'varchar(max)'))) , Pos3 = ltrim(rtrim(xDim.value('/x[3]', 'varchar(max)'))) , Pos4 = ltrim(rtrim(xDim.value('/x[4]', 'varchar(max)'))) , Pos5 = ltrim(rtrim(xDim.value('/x[5]', 'varchar(max)'))) , Pos6 = ltrim(rtrim(xDim.value('/x[6]', 'varchar(max)'))) , Pos7 = ltrim(rtrim(xDim.value('/x[7]', 'varchar(max)'))) From ( Select Cast('<x>' + replace((Select replace(replace(A.subscription_number, ' ', '-'), '-', '§§Split§§') as [*] For XML Path('')), '§§Split§§', '</x><x>') + '</x>' as xml) as xDim ) as A ) B
このアプローチにより、単一の列の値を複数の新しい列にエレガントに分割でき、データを保存およびアクセスするためのクリーンで構造化された方法が提供されます。
以上がSQL でサブスクリプション番号の単一列を複数の列に分割するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。