このソリューションは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
をハッピー演奏...
マルコ・セイン
Oracleを使用する場合は、この方法を使用して文字列を分割することができhttps://blogs.oracle.com/aramamooを説明/ entry/how_to_split_comma_separated_string_and_pass_to_in_clause_of_select_statement ...あるSQLステートメントで実行できるはずです...幸運 – Ruskin
Postgresでは 'unnest(string_to_array()) 'を使用できます –
PSあなたのデータ構造を修正し、テーブルを正規化し、それ以降に満足してください。 – GurV