17.10 - 例: CSVデータのシュレッディング - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - DATASETデータ型

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1198-171K-JPN
Language
日本語 (日本)

VARCHARまたはCLOBとして表わされる既存のCSVデータを、データベースの既存のリレーショナル テーブルにインポートすることができます。これは「シュレッディング」と呼ばれ、DATASET_TABLEテーブル演算子を使用します。

例: CSVデータのデータベース テーブルへのシュレッディング

CreateDATASETを使用して、CSVデータをCSV格納形式のDATASET値に変換します。CSVデータが標準のCSV形式に従わない場合(例えば、異なる列またはレコードの区切り記号がある場合)、スキーマを指定します。次にDATASET_TABLEはCSVデータをデータベース テーブルにシュレッディングします。DATASET_TABLEを使用して、'column_expression_literal' USING仕様を使用してCSV値で各列データ型を指定します。

CREATE TABLE empTableFromCSV(
 empID INTEGER, 
 empName VARCHAR(20),
 empSalary INTEGER);

例: CSV列とテーブル列の位置合わせ

*+csv11.txt+*
empID,empName,empSalary
1,John,100000
2,Sam,50000
3,Mary,75000

.import vartext file csv11.txt
USING (c1 VARCHAR(1000))
INSERT INTO empTableFromCSV 
SELECT * FROM DATASET_TABLE (
 ON (SELECT CreateDATASET(NULL, :c1, CSV))
 USING rowexpr('') 
   colexpr(
  '[ {"dotnotation" : "$..empID",
      "type" : "INTEGER"},
     {"dotnotation" : "$..empName",
              "type" : "VARCHAR(20)"} ,
     {"dotnotation" : "$..empSalary",
              "type" : "INTEGER"} ]')
) AS Emp(empID, empName, empSalary);

SELECT * FROM empTableFromCSV ORDER BY 1;
結果のテーブルには次の3つの行があります。
empID empName empSalary
1 John 100000
2 Sam 50000
3 Mary 75000

例: CSV列とテーブル名は同じであるが、位置合わせされない

*+csv12.txt+*
empID,empSalary,empName
4,100000,Kate
5,50000,Rob
6,75000,Peter
CSV列とテーブル名を位置合わせする手順:
.import vartext file csv12.txt
USING (c1 VARCHAR(1000))
INSERT INTO empTableFromCSV(empID,empSalary,empName) 
SELECT * FROM DATASET_TABLE (
 ON (SELECT CreateDATASET(NULL, :c1, CSV))
 USING rowexpr('') 
   colexpr(
  '[ {"dotnotation" : "$..empID",
      "type" : "INTEGER"},
     {"dotnotation" : "$..empSalary",
              "type" : "INTEGER"} ,
     {"dotnotation" : "$..empName",
              "type" : "VARCHAR(20)"} ]')
) AS Emp(empID, empSalary, empName);

例: スキーマをCreateDATASETに渡す

この例では、CSVにはヘッダーはありませんが、値はターゲット テーブルに完全に位置合わせされます。スキーマをCreateDATASET関数に渡して、CSV値にヘッダー行がないことを示すことができます。
*+csv13.txt+*
7,Matt,100000
8,Mark,50000
9,Luke,75000

.import vartext file csv13.txt
USING (c1 VARCHAR(1000))
INSERT INTO empTableFromCSV 
SELECT * FROM DATASET_TABLE (
 ON (SELECT CreateDATASET('{"field_names":NULL}':c1, CSV))
 USING rowexpr('')
   colexpr(
  '[ {"dotnotation" : "$..empID",
     "type" : "INTEGER"},
     {"dotnotation" : "$..empName",
              "type" : "VARCHAR(20)"} ,
     {"dotnotation" : "$..empSalary",
              "type" : "INTEGER"} ]')
) AS Emp(empID, empName, empSalary);

例: テーブル内のすべての従業員を返す

SELECT * FROM empTableFromCSV ORDER BY 1;
empID empName empSalary
1 John 100000
2 Sam 50000
3 Mary 75000
4 Kate 100000
5 Rob 50000
6 Peter 75000
7 Matt 100000
8 Mark 50000
9 Luke 75000