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

1つの列の値を複数の列の値に分割する

    これがインラインアプローチです

    Declare @YourTable table (SomeCol varchar(max))
    Insert Into @YourTable values
    ('SC 5-1395-174-25P'),
    ('SC 1-2134-123-ABC C1-2'),
    ('SC 12-5245-1247-14&P'),
    ('SC ABCD-2525-120')
    
    
    Select B.*
     From  @YourTable 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.SomeCol,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
    

    返品

    編集

    1)テーブルを作成する

    CREATE TABLE MyNewPubTable (PUB_FORM_NUM NVARCHAR(50) , COL1 NVARCHAR(10) , COL2 NVARCHAR(10) , COL3 NVARCHAR(10) , COL4 NVARCHAR(10) , COL5 NVARCHAR(10) , COL6 NVARCHAR(10) , COL7 NVARCHAR(10)) 
    

    2)クエリを実行します

    Declare @YourTable table (PUB_FORM_NUM varchar(max))
    Insert Into @YourTable values
    ('SC 5-1395-174-25P'),
    ('SC 1-2134-123-ABC C1-2'),
    ('SC 12-5245-1247-14&P'),
    ('SC ABCD-2525-120')
    
    Insert Into MyNewPubTable
    Select A.PUB_FORM_NUM
          ,B.*
     From  @YourTable 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.PUB_FORM_NUM,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
    

    3)結果を確認する

    Select * From MyNewPubTable
    

    編集2

    または、その場でテーブルを作成できます

    Declare @YourTable table (PUB_FORM_NUM varchar(max))
    Insert Into @YourTable values
    ('SC 5-1395-174-25P'),
    ('SC 1-2134-123-ABC C1-2'),
    ('SC 12-5245-1247-14&P'),
    ('SC ABCD-2525-120')
    
    Select A.PUB_FORM_NUM
          ,B.*
     Into  MyNewPubTable
     From  @YourTable 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.PUB_FORM_NUM,' ','-'),'-','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A 
                 ) B
    
    Select * From MyNewPubTable
    


    1. Oracle21cをSQLServerに接続する

    2. SQLServerで日時の時間部分を削除するための最良のアプローチ

    3. OracleへのEFクエリがORA-12704をスローします:文字セットの不一致

    4. MySQLのパフォーマンス:MySQLデータベースのインデックス作成を活用する方法