2

私は新しい表にサブストリングする必要がある単一の列にデータを持っています。私の問題は、最初の列のデータの長さが10文字か9文字のいずれかであることがあり、2列目が9文字または8文字であることがあるため、データ。部分文字列をスペースで区切って区切った値を区切ります。

1465723732 353812955 2 88903391 N L 2016-06-28 13:48:57 2017-06-30 00:12:43 5 
990459128 264834338 1 67093407 Y L 2001-01-01 00:00:00 2016-07-09 08:10:20 20 
269660184 91753484 1 23492107 Y L 2000-01-01 00:00:00 2013-04-23 09:10:12 15 

2番目の列は8つの文字である場合、最初の9つの文字である:

データは次のようになります。データの断片は、列に均等に分割されるのではなく、1つの空間で区切られるため、部分文字列は次のデータの桁などを取ります。

誰でもこれを行う方法を提案できますか?ありがとう。

+2

ない完全な答えは、私は、このデータはさえになることはありませんことを言うかもしれませんMySQLデータベース?このデータをMySQLに取り込む前に、このデータを別々の列にスクラブしておく必要があります。このようなテキスト操作には多くのツールや言語があります。 –

+1

あなたはMySQLのデータに悩まされているので、できることについてはかなり制限されています。基本的な文字列関数は大量の醜いコードなしではあまり役に立ちません。あなたはUDFを使って調べることができますが、それはまた私にとって魅力的ではないようです。最善の方法は、データを外部にスクラブして戻すことです。 –

+0

データがサンプルとすべて同じで、SQL Serverの最新バージョンを使用している場合は、新しいSTRING_SPLITコマンドを区切り文字スペースの? –

答えて

2

これはエレガントではありませんが、それはあなたがデータを形作るのに役立ちます:

WITH testdata(col) AS (
    SELECT '1465723732 353812955 2 88903391 N L 2016-06-28 13:48:57 2017-06-30 00:12:43 5' UNION 
    SELECT '990459128 264834338 1 67093407 Y L 2001-01-01 00:00:00 2016-07-09 08:10:20 20' UNION 
    SELECT '269660184 91753484 1 23492107 Y L 2000-01-01 00:00:00 2013-04-23 09:10:12 15' 
), tempdata(cols) AS (
    SELECT CAST('<col>' + REPLACE(col, ' ', '</col><col>') + '</col>' AS XML) 
    FROM testdata 
) 
SELECT 
    cols.value('/col[1]', 'INT') AS col1, 
    cols.value('/col[2]', 'INT') AS col2, 
    cols.value('/col[3]', 'INT') AS col3, 
    cols.value('/col[4]', 'INT') AS col4, 
    cols.value('/col[5]', 'CHAR(1)') AS col5, 
    cols.value('/col[6]', 'CHAR(1)') AS col6, 
    cols.value('/col[7]', 'DATE') AS col7, 
    cols.value('/col[8]', 'TIME(0)') AS col8, 
    cols.value('/col[9]', 'DATE') AS col9, 
    cols.value('/col[10]', 'TIME(0)') AS col10, 
    cols.value('/col[11]', 'INT') AS col11 
FROM tempdata 

出力:

col1  | col2  | col3 | col4  | col5 | col6 | col7  | col8  | col9  | col10 | col11 
-----------+-----------+------+----------+------+------+------------+----------+------------+----------+------ 
1465723732 | 353812955 | 2 | 88903391 | N | L | 2016-06-28 | 13:48:57 | 2017-06-30 | 00:12:43 | 5  
990459128 | 264834338 | 1 | 67093407 | Y | L | 2001-01-01 | 00:00:00 | 2016-07-09 | 08:10:20 | 20 
269660184 | 91753484 | 1 | 23492107 | Y | L | 2000-01-01 | 00:00:00 | 2013-04-23 | 09:10:12 | 15 
+0

待って...正確に1つのスペースがありますか?それは簡単です。 OPを編集して、フォーマットせずに正確なデータを貼り付けてください。 –

+0

@あなたはデータベースを変更しました!とにかく、修正された答えを見てください。 –

+0

'CROSS APPLY'の使用を検討して、XMLへの置き換えと変換が複製されるのではなく1回だけ現れるようにするとよいでしょう。 –

関連する問題