2017-01-27 6 views
0

複数のカンマ区切りの値を格納する列があります。その行の残りの値とともにその列の値と同じ数の行に分割されるように分割する必要があります。セルを分割してSQLで新しい行を作成する方法

例:

John 111 2Jan 
Sam 222,333 3Jan 
Jame 444,555,666 2Jan 
Jen 777 4Jan 

出力:

John 111 2Jan 
Sam 222 3Jan 
Sam 333 3Jan 
Jame 444 2Jan 
Jame 555 2Jan 
Jame 666 2Jan 
Jen 777 4Jan 

P.S:私はこれに似た複数の質問を見てきましたが、そのような方法で分割する方法を見つけることができませんでした。

+0

Oracleを使用する場合は、この方法を使用して文字列を分割することができhttps://blogs.oracle.com/aramamooを説明/ entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement ...あるSQLステートメントで実行できるはずです...幸運 – Ruskin

+0

Postgresでは 'unnest(string_to_array()) 'を使用できます –

+2

PSあなたのデータ構造を修正し、テーブルを正規化し、それ以降に満足してください。 – GurV

答えて

0

このソリューションはVertica上に構築されていますが、SPLIT_PART()に対応する関数を提供するすべてのデータベースで機能します。私はそう

Pivot sql convert rows to columns

になります。それの

パートは私がここで説明し、すべてのANSI準拠のデータベースプラットフォーム(スクリプトの単なる非旋回する部分)で動作します非ピボット技術に対応しますそれはここの下で好きですか?私は、最小限の日付表現が2列の入力表の第2列の一部であると仮定しています。だから私は最初に短い日付のリテラルを最初のCommon Table Expressionで分割しています(コメントでは、CTEの出力をリストしています)。カンマ区切りのリストをトークンに分割する前に、ここで

が行く:

WITH 
-- input 
input(name,the_string) AS (
      SELECT 'John', '111 2Jan' 
UNION ALL SELECT 'Sam' , '222,333 3Jan' 
UNION ALL SELECT 'Jame', '444,555,666 2Jan' 
UNION ALL SELECT 'Jen' , '777 4Jan' 
) 
, 
-- put the strange date literal into a separate column 
the_list_and_the_date(name,list,datestub) AS (
SELECT 
    name 
, SPLIT_PART(the_string,' ',1) 
, SPLIT_PART(the_string,' ',2) 
FROM input 
) 
-- debug 
-- SELECT * FROM the_list_and_the_date; 
-- name|list  |datestub 
-- John|111  |2Jan 
-- Sam |222,333 |3Jan 
-- Jame|444,555,666|2Jan 
-- Jen |777  |4Jan 
, 
-- ten integers (too many for this example) to use as pivoting value and as "index" 
ten_ints(idx) AS (
      SELECT 1 
UNION ALL SELECT 2 
UNION ALL SELECT 3 
UNION ALL SELECT 4 
UNION ALL SELECT 5 
UNION ALL SELECT 6 
UNION ALL SELECT 7 
UNION ALL SELECT 8 
UNION ALL SELECT 9 
UNION ALL SELECT 10 
) 
-- the final query - pivoting prepared input using a CROSS JOIN with ten_ints 
-- and filter out where the SPLIT_PART() expression evaluates to the empty string 
SELECT 
    name 
, SPLIT_PART(list,',',idx) AS token 
, datestub 
FROM the_list_and_the_date 
CROSS JOIN ten_ints 
WHERE SPLIT_PART(list,',',idx) <> '' 
; 

name|token|datestub 
John|111 |2Jan 
Jame|444 |2Jan 
Jame|555 |2Jan 
Jame|666 |2Jan 
Sam |222 |3Jan 
Sam |333 |3Jan 
Jen |777 |4Jan 

をハッピー演奏...

マルコ・セイン

関連する問題