

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 変換ルール式を使用した列の内容の定義
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions"></a>

新しい列と既存の列の内容を定義するには、変換ルール内で式を使用します。たとえば、式を使用すると、列を追加したり、ソーステーブルヘッダーをターゲットにレプリケートしたりできます。また、式を使用して、ターゲットテーブルのレコードに、ソースで挿入済み、更新済み、または削除済みというフラグを付けることもできます。

**Topics**
+ [式を使用した列の追加](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding)
+ [式を使用したターゲットレコードのフラグ付け](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging)
+ [式を使用したソーステーブルヘッダーのレプリケート](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers)
+ [SQLite 関数を使用して式を構築する](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite)
+ [式を使用したターゲット テーブルへのメタデータ追加](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata)

## 式を使用した列の追加
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-adding"></a>

変換ルールの式を使用してテーブルに列を追加するには、`add-column` ルールアクションと `column` ルールターゲットを使用します。

次の使用例は、`ITEM` テーブルに新しい列を追加します。新しい列名が `FULL_NAME` に設定されます。データ型は `string`、長さは 50 文字です。式は、2 つの既存の列の値 `FIRST_NAME` および `LAST_NAME` を連結して `FULL_NAME` を評価します。`schema-name` および `table-name`、式パラメータは、ソース データベーステーブル内のオブジェクトを参照します。`Value` と `data-type` ブロックは、ターゲット データベーステーブル内のオブジェクトを参照します。

```
{
    "rules": [
        {
            "rule-type": "selection", 
            "rule-id": "1",
            "rule-name": "1",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "%"
            },
            "rule-action": "include"
        },
        {
            "rule-type": "transformation",
            "rule-id": "2",
            "rule-name": "2",
            "rule-action": "add-column",
            "rule-target": "column",
            "object-locator": {
                "schema-name": "Test",
                "table-name": "ITEM"
            },
            "value": "FULL_NAME",
            "expression": "$FIRST_NAME||'_'||$LAST_NAME",
            "data-type": {
                 "type": "string",
                 "length": 50
            }
        }
    ]
}
```

## 式を使用したターゲットレコードのフラグ付け
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Flagging"></a>

ターゲットテーブルのレコードにソーステーブルで挿入済み、更新済み、または削除済みというフラグを付けるには、変換ルールで式を使用します。式は、`operation_indicator` 関数を使用してレコードにフラグを付けます。ソースから削除されたレコードは、ターゲットから削除されません。代わりに、ターゲットレコードには、ソースから削除されたことを示すユーザー指定の値でフラグが付けられます。

**注記**  
`operation_indicator` 関数は、ソースデータベースとターゲットデータベースの両方にプライマリキーがあるテーブルでのみ機能します。

たとえば、次の変換ルールは、まずターゲットテーブルに新しい `Operation` 列を追加します。次に、ソーステーブルからレコードが削除されるたびに、値 `D` で列を更新します。

```
{
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "Operation",
      "expression": "operation_indicator('D', 'U', 'I')",
      "data-type": {
        "type": "string",
        "length": 50
      }
}
```

## 式を使用したソーステーブルヘッダーのレプリケート
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Headers"></a>

デフォルトでは、ソーステーブルのヘッダーはターゲットにレプリケートされません。レプリケートするヘッダーを指定するには、テーブルの列ヘッダーを含む式を含む変換ルールを使用します。

式では、次の列ヘッダーを使用できます。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/dms/latest/userguide/CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions.html)

次の例では、ソースからのストリーム位置の値を使用して、ターゲットに新しい列を追加します。SQL サーバー の場合、ストリーム位置の値は、ソース エンドポイントの SCN です。Oracle の場合、ストリーム位置の値はソースエンドポイントの LSN です。

```
{
      "rule-type": "transformation",
     "rule-id": "2",
      "rule-name": "2",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value": "transact_id",
      "expression": "$AR_H_STREAM_POSITION",
      "data-type": {
        "type": "string",
        "length": 50
      }
    }
```

次の使用例は、ソースから一意の増分番号を持つ新しい列をターゲットに追加します。この値は、タスクレベルでの 35 桁の一意の数字を表します。最初の 16 桁はタイムスタンプの一部であり、最後の 19 桁は DBMS によって増分された record\$1id 番号です。

```
{
"rule-type": "transformation",
"rule-id": "2",
"rule-name": "2",
"rule-target": "column",
"object-locator": {
"schema-name": "%",
"table-name": "%"
},
"rule-action": "add-column",
"value": "transact_id",
"expression": "$AR_H_CHANGE_SEQ",
"data-type": {
"type": "string",
"length": 50
}
}
```

## SQLite 関数を使用して式を構築する
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite"></a>

テーブル設定を使用して、指定されたオペレーションで選択されたテーブルまたはビューに適用する設定を指定します。テーブル設定ルールはオプションです。

**注記**  
MongoDB と DocumentDB データベースでは、テーブルやビューという概念の代わりに、**コレクションにまとめられたドキュメントとしてデータレコード保存します。そのため、MongoDB ソースまたは DocumentDB ソースから移行する場合は、テーブルやビューではなく、**選択したコレクションに対する並列ロード設定の範囲セグメンテーションタイプを考慮します。

**Topics**
+ [CASE 式の使用](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE)
+ [例](#CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex)

変換ルール式を作成するために使用できる文字列関数を以下に示します。


| 文字列関数 | 説明 | 
| --- | --- | 
|  `lower(x)`  |  `lower(x)` 関数はすべての文字が小文字に変換された文字列のコピー *`x`* を返します。デフォルトの、組み込み `lower` 関数は ASCII 文字に対してのみ機能します。  | 
|  `upper(x)`  |  `upper(x)` 関数は、すべての文字が小文字に変換された文字列 *`x`* のコピーを返す。デフォルトの、組み込み `upper` 関数は ASCII 文字に対してのみ機能します。  | 
|  `ltrim(x,y)`  |  `ltrim(x,y)` 関数は、x の左辺から y に現れるすべての文字を削除して形成された文字列を返します。y の値がない場合、`ltrim(x)` は x の左辺からスペースを削除します。  | 
|  `replace(x,y,z)`  |  `replace(x,y,z)` 関数は、文字列 x 内の文字列 y の出現ごとに文字列 z を代入して形成された文字列を返します。  | 
| `rtrim(x,y)` |  `rtrim(x,y)` 関数は、x の右側から y に現れるすべての文字を削除して形成された文字列を返します。y の値がない場合、`rtrim(x)` は x の右側からスペースを削除します。  | 
| `substr(x,y,z)` |  `substr(x,y,z)` 関数は、`y` 番目の文字で始まる、文字長 *`z`* の入力文字列 `x` の部分文字列を返します。 *`z`* が省略され、`substr(x,y)` は、`y` 番目の文字で始まる文字列 `x` の最後を通してすべての文字を返します。`x` の左端の文字は番号 1 です。*`y`* が負の場合、部分文字列の最初の文字は左ではなく右から数えて見つけられます。*`z`* が負の場合、`y` 番目の文字より前にある `abs(z)` 文字が返されます。`x` が文字列の場合、文字のインデックスは実際の UTF-8 文字を参照します。`x` が BLOB の場合、インデックスはバイトを参照します。  | 
| trim(x,y) |  `trim(x,y)` 関数は、`x` の両側から `y` に表示されるすべての文字を削除して形成された文字列を返します。。`y` に値がない場合、`trim(x)`は、`x` の両側からスペースを削除します。  | 

変換ルール式の作成に使用できる LOB 関数を以下に示します。


| LOB 関数 | 説明 | 
| --- | --- | 
|  `hex(x)`  |  `hex` 関数は BLOB を引数として受け取り、BLOB コンテンツの大文字 16 進文字列バージョンを返します。  | 
|  `randomblob (N)`  |  `randomblob(N)` 関数は疑似乱数バイトを含む `N` バイト BLOB を返します。*N* が 1 未満の場合、1 バイトのランダム BLOB が返されます。  | 
|  `zeroblob(N)`  |  `zeroblob(N)` 関数は、0x00 の `N` バイトで構成される BLOB を返します。  | 

変換ルール式の作成に使用できる数値関数を以下に示します。


| 数値関数 | 説明 | 
| --- | --- | 
|  `abs(x)`  |  `abs(x)` 関数は、数値引数 `x` の絶対値を返します。`abs(x)` 関数は *x* が NULL の場合 NULL を返します。`abs(x)` 関数は、**x** が数値に変換できない文字列または BLOB の場合に 0.0 を返します。  | 
|  `random()`  |  `random` 関数は、-9,223,372,036,854,775,808 から \$19,223,372,036,854,775,807 の擬似乱数を返します。  | 
|  `round (x,y)`  |  `round (x,y)` 関数は四捨五入して小数点の右側の *y* 桁までとした浮動小数点値 *x* を返します。*y* に値がない場合、0 と仮定されます。  | 
|  `max (x,y...)`  |  複数引数 `max` 関数は、最大値を持つ引数を返すか、引数が NULL の場合は NULL を返します。 `max` 関数は、引数を左から右へ検索し照合関数を定義する引数を探します。見つかった場合は、その照合関数をすべての文字列比較に使用します。照合関数を定義する `max` への引数がない場合、`BINARY` の照合機能が使用されます。`max` 関数は、複数の引数を持つ場合は単純な関数ですが、引数が 1 つの場合は集計関数として動作します。  | 
|  `min (x,y...)`  |  複数 引数`min` 関数は、最小値を持つ引数を返します。 `min` 関数は、引数を左から右へ検索し照合関数を定義する引数を探します。見つかった場合は、その照合関数をすべての文字列比較に使用します。照合関数を定義する `min` への引数がない場合、`BINARY` の照合機能が使用されます。`min` 関数は、複数の引数を持つ場合は単純な関数ですが、引数が 1 つの場合は集計関数として動作します。  | 

変換ルール式を作成するために使用できる NULL チェック関数を以下に示します。


| NULL チェック関数 | 説明 | 
| --- | --- | 
|  `coalesce (x,y...)`  |  `coalesce` 関数は、最初の非 NULL 引数のコピーを返しますが、すべての引数が NULL の場合は NULL を返します。coalesce 関数には、少なくとも 2 つの引数があります。  | 
|  `ifnull(x,y)`  |  `ifnull` 関数は、最初の非 NULL 引数のコピーを返しますが、両方の引数が NULL の場合は NULL を返します。`ifnull` 関数にはちょうど 2 つの引数があります。`ifnull` 関数は 2つの引数を持つ `coalesce` と同じです。  | 
|  `nullif(x,y)`  |  `nullif(x,y)` 関数は、引数が異なる場合は最初の引数のコピーを返しますが、引数が同じ場合は NULL を返します。 `nullif(x,y)` 関数は、引数を左から右へ検索し照合関数を定義する引数を探します。見つかった場合は、その照合関数をすべての文字列比較に使用します。nullifのどちらの引数も照合関数を定義していない場合、`BINARY` 照合機能が使用されます。  | 

変換ルール式を作成するために使用できる日付と時刻関数を以下に示します。


| 日付および時刻関数 | 説明 | 
| --- | --- | 
|  `date(timestring, modifier, modifier...)`  |  `date` 関数は、YYYY-MM-DD 形式で日付を返します。  | 
|  `time(timestring, modifier, modifier...)`  |  `time` 関数は、HH: MM: SS の形式で時刻を返します。  | 
|  `datetime(timestring, modifier, modifier...)`  |  `datetime` 関数は、YYYY-MM-DD HH: MM: SS の形式で日付と時刻を返します。  | 
|  `julianday(timestring, modifier, modifier...)`  |  `julianday` 関数は、グリニッジで紀元前4714年11月24日の正午からの日数を返します。  | 
|  `strftime(format, timestring, modifier, modifier...)`  |  `strftime` 関数は、次のいずれかの変数を使用して、最初の引数として指定された書式文字列に従って日付を返します： `%d`: 月の日 `%H`: 時間 00—24 `%f`: \$1\$1 秒の小数部分 SS.SSS `%j`: 年始からの日 001～366 `%J`: \$1\$1 ユリウス日数 `%m`: 月 01—12 `%M`: 分 00～59 `%s`: 1970-01-01 からの秒 `%S`: 秒 00～59 `%w`: 週初からの日 0～6、日曜日 == 0) `%W`: 00-53 の週 `%Y`: 0000—9999 年 `%%`: %  | 

変換ルール式を作成するために使用できるハッシュ関数を以下に示します。


| ハッシュ関数 | 説明 | 
| --- | --- | 
|  `hash_sha256(x)`  |  `hash` 関数は、(SHA-256 アルゴリズムを使用して)入力列のハッシュ値を生成し、生成されたハッシュ値の 16 進値を返します。 式内の `hash` 関数を使用するには、`hash_sha256(x)` を式に追加し、*`x`* をソース列名で置換します。  | 

### CASE 式の使用
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.CASE"></a>

SQLite `CASE` 式は、条件のリストを評価し、結果に基づいて式を返します。構文を以下に示します。

```
    CASE case_expression
     WHEN when_expression_1 THEN result_1
     WHEN when_expression_2 THEN result_2
     ...
     [ ELSE result_else ] 
    END

# Or 

     CASE
     WHEN case_expression THEN result_1
     WHEN case_expression THEN result_2
     ...
     [ ELSE result_else ] 
    END
```

### 例
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-SQLite.Ex"></a>

**Example ケース条件を使用してターゲット テーブルに新しい文字列列を追加する**  
例えば、次の変換ルールは、まずターゲットテーブル `employee` に新しい `emp_seniority` 列を追加します。給与列に SQLite `round` 関数を使って、給与が 20,000 に等しいか超えるかをチェックするケース条件を指定します。そうであれば、列は値 `SENIOR` を取得し、それ以外は何でもその値が `JUNIOR` となります。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "emp_seniority",
      "expression": " CASE WHEN round($emp_salary)>=20000 THEN ‘SENIOR’ ELSE ‘JUNIOR’ END",
      "data-type": {
        "type": "string",
        "length": 50
      }

  }
```

**Example SUBSTR 関数を使用してターゲットテーブルに新しい文字列を追加する**  
次の変換ルールの例では、列内のデータを定義する SQLite 演算子または関数を使用して、新しい文字列を追加します。このアプローチでは、SQLite 関数を使用して、Oracle からロードされた GUID データを、Postgresql ターゲットテーブルに挿入する前に UUID フォーマットに変換します。  
次のルールでは、SQLite 部分文字列関数 (SUBSTR)、16 進関数 (HEX)、小文字 (LOWER) 関数を使用して、GUID データをハイフンで区切られた複数のグループに分割します。具体的には、8 桁のグループの後に 4 桁の 3 つのグループ、その後に 12 桁のグループが続き、合計 32 桁の数字で 128 ビットを表します。  
変換ルールによるターゲット後処理のサンプルソースデータと出力は次のとおりです。  
**ソーステーブル (Oracle GUID 形式)**    
T\$1COL2  

```
06F6949D234911EE80670242AC120002
1A2B3C4D5E6F11EE80670242AC120003
F5E4D3C2B1A011EE80670242AC120004
```
**ターゲットテーブル (PostgreSQL UUID 形式)**    
T\$1COL2\$1TMP  

```
06f6949d-2349-11ee-8067-0242ac120002
1a2b3c4d-5e6f-11ee-8067-0242ac120003
f5e4d3c2-b1a0-11ee-8067-0242ac120004
```

```
{
  "rule-type": "transformation",
  "rule-id": "2",
  "rule-name": "2",
  "rule-action": "add-column",
  "rule-target": "column",
  "object-locator": {
    "schema-name": "SPORTS",
    "table-name": "TEST_TBL_2"
  },
  "value": "t_col2_tmp",
  "expression": "CASE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) WHEN '----' THEN NULL ELSE LOWER(SUBSTR(HEX($T_COL2), 1, 8) || '-' || SUBSTR(HEX($T_COL2), 9, 4) || '-' || SUBSTR(HEX($T_COL2), 13, 4) || '-' || SUBSTR(HEX($T_COL2), 17, 4) || '-' || SUBSTR(HEX($T_COL2), 21, 12)) END",
  "data-type": {
    "type": "string",
    "length": 60
  }
}
```

**Example ターゲット テーブルに新しい日付列を追加する**  
次の使用例は、ターゲット テーブル，`createdate`, に新しい日付列を追加します `employee` 。SQLite の日付関数 `datetime` を使用する場合、挿入された各行について、新しく作成されたテーブルに日付が追加されます。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "createdate",
      "expression": "datetime ()",
      "data-type": {
        "type": "datetime",
        "precision": 6
      }
  }
```

**Example ターゲット テーブルに新しい数値列を追加する**  
次の使用例は、ターゲット テーブル `rounded_emp_salary` に新しい列 `employee` を追加します。SQLite `round` 関数を使って四捨五入された給与を追加します。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "rounded_emp_salary",
      "expression": "round($emp_salary)",
      "data-type": {
        "type": "int8"
      }
  }
```

**Example ハッシュ関数を使用してターゲット テーブルに新しい文字列カラムを追加する**  
次の使用例は、ターゲット テーブル `employee` に新しい列 `hashed_emp_number` を追加します。SQLite `hash_sha256(x)` 関数は、ソース列 `emp_number` のターゲットにハッシュ値を作成します。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "public",
        "table-name": "employee"
      },
      "value": "hashed_emp_number",
      "expression": "hash_sha256($emp_number)",
      "data-type": {
        "type": "string",
        "length": 64
      }
  }
```

## 式を使用したターゲット テーブルへのメタデータ追加
<a name="CHAP_Tasks.CustomizingTasks.TableMapping.SelectionTransformation.Expressions-Metadata"></a>

次の式を使用して、メタデータ情報をターゲット テーブルに追加できます：
+ `$AR_M_SOURCE_SCHEMA` – ソーススキーマの名前。
+ `$AR_M_SOURCE_TABLE_NAME` – ソーステーブルの名前。
+ `$AR_M_SOURCE_COLUMN_NAME` – ソーステーブルの列の名前。
+ `$AR_M_SOURCE_COLUMN_DATATYPE` – ソーステーブルの列のデータ型。

**Example ソースのスキーマ名を使用してスキーマ名の列を追加する**  
次の例では、ソースからのスキーマ名を使用して、ターゲットに新しい列 `schema_name` を追加します。  

```
  {
      "rule-type": "transformation",
      "rule-id": "2",
      "rule-name": "2",
      "rule-action": "add-column",
      "rule-target": "column",
      "object-locator": {
        "schema-name": "%",
        "table-name": "%"
      },
      "rule-action": "add-column",
      "value":"schema_name",
      "expression": "$AR_M_SOURCE_SCHEMA", 
      "data-type": { 
         "type": "string",
         "length": 50
      }
  }
```