IICS データ統合処理における関数・式のリスト

# はじめに
　IICSのCloud Data Integration(対訳：データ統合)機能では、マッピングによってデータ統合処理を容易に進めることができます。マッピングの中には、処理を行うための構成要素がたくさんリリースされています(ジョイナや構造パーサなど)。その中でも「式」は、大量のデータを一行ごとに変換や計算といった処理を可能にします。
　業務の中で、IICSのデータ統合機能を使って、既存のデータを「式」で変換し、クラウド上に移行する経験を積みました。本記事では、業務の中で使った「式」の関数について備忘録を兼ねてリストとしてまとめます。

# SUBSTR
　文字列の一部を返す関数。

```ts
SUBSTR( string, start, length)
```

``string``は、任意の文字列型の変数。任意の数値を渡すと、SUBSTR関数は文字列型に変換して処理をします。
``start``は、抽出したい文字列の最初の文字数。整数でなければなりません。
・*start*が正数のとき、SUBSTR関数は文字列*string*の最初の文字からその数を数えた分だけの位置を開始位置とします。
・*start*が負の整数のとき、SUBSTR関数は文字列*string*の最後の文字からその数を数えた分だけの位置を開始位置とします。
・*start*が0のとき、SUBSTR関数は文字列の最初の文字から検索を開始します。(*start*が1のときも、SUBSTR関数は文字列の最初の文字から検索を開始するので、*start*に0と1は同じ扱いと言えます。)
``length``は、抽出したい文字列の文字数。(抽出したい文字列の最後の文字数ではない点に注意！)したがって、正数でなければなりません。*length*を省略すると、SUBSTR関数は*start*の開始位置から文字列の終わりまで、すべての文字を返します。
・*length*が負の整数または0の時、SUBSTR関数は空の文字列を返します。
・*length*が小数の時、SUBSTR関数はそれを最も近い整数値に丸めます。

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-78161B13-1E38-464C-88D3-A05CD939FFDA.html

# TO_INTEGER
　文字列や数値を<u>整数</u>に変換する関数。

```ts
TO_INTEGER( value, flag)
```

``value``は、整数に変換したい文字列型の数字。
``flag``は、小数点以下を切り捨てるか、丸めるかを指定するオプション引数。整数か、TRUE、FALSEの指定しかできません。
・*flag*がTRUEまたは非負整数のとき、小数点以下を切り捨てます。
・*flag*がFALSEまたは0のとき、TO_INTEGER関数は値を近似値の整数に丸めます。

例
``TO_INTEGER( value, TRUE)``

| value      | RETURN_VALUE| 
|:-----------|:------------|
| '10'       | 10          |
| '3.14'     | 3           |
| '99.99'    | 99          |
| 'will'     | 0           |
| '-15.77'   | -15         |
| '-6.1'     | -6          |

例
``TO_INTEGER( value, FALSE)``

| value      | RETURN_VALUE| 
|:-----------|:------------|
| '10'       | 10          |
| '3.14'     | 3           |
| '99.99'    | 100         |
| 'will'     | 0           |
| '-15.77'   | -16         |
| '-6.1'     | -6          |

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-4F0391CC-D893-470C-8E6F-148610E3CD24.html

# TO_DECIMAL
　文字列型の数字を数値に変換する関数。

```ts
TO_DECIMAL( value, scale)
```

``value``は、数値に変換したい文字列型の数字。
``scale``は、小数点以下の桁数を指定。*scale*を省略すると、TO_DECIMAL関数は*value*と同じ位取りの値を出力します。

例
``TO_DECIMAL( value, 3)``

| value      | RETURN_VALUE| 
|:-----------|:------------|
| '10'       | 10.000      |
| '3.14'     | 3.140       |
| 'will'     | 0           |
| '-15.77'   | -15.770     |

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-968258E6-7118-4F3B-A3C3-E0BE1367CF9D.html

# TO_DATE
　文字列を同じ形式の日付型に変換する関数。
```ts
TO_DATE( string, format)
```
``*string*``は、日付型に変換したい文字列。
``*format*``は、変換したい日付型のフォーマットを指定。*format*の文字列は*string*と一致しなければなりません。
戻り値は日付型ですが、必ず日付と時刻をセットにして返します。したがって、*format*には任意で時刻のフォーマットも指定しなければなりません。時刻を含まない*string*を渡すと、返される日付の時刻は常に00:00:00になります。

例
``TO_DATE( DATE, 'YYYY/MM/DD HH24:MI:SS')``

| DATE                | RETURN_VALUE      |
|:--------------------|:------------------|
|'2022/02/28 15:00:45'|2022/02/28 15:00:45|
|'2022/03/09'         |2022/03/09 00:00:00|
|'20220406 160600'    |*ERROR*            |

　3例目のように、*format*と一致しないDATEを入れるとエラーが生じます。また、時刻のフォーマットも24時間表記(HH24)か12時間表記(HH12)かを明示する必要があります。変換したいデータに合わせて、明記しましょう。

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-703B6534-9081-47C4-BA0B-59B0A8920980.html


※IICSでの日付型に関するサポートは以下の公式ドキュメントで詳しく説明されています。

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-A460A6C0-40A1-4FD6-BDB7-CD1C0228A2DD/GUID-69D3F125-520A-4745-9381-120D4F4F1912.html#GUID-69D3F125-520A-4745-9381-120D4F4F1912

# CONCAT
　2つの文字列を連結する関数。
```ts
CONCAT( first_string, second_string)
```

例
``CONCAT( FIRST, SECOND)``

| FIRST    | SECOND  | RETURN_VALUE  |
|:---------|:--------|:--------------|
| 'Wishy'  | 'Washy' | 'WishyWashy'  |
| 'Johnny' | 'Depp'  | 'JohnnyDepp'  |

　CONCAT関数は2つの文字列を連結させることしかできません。3つの文字列異常を連結させたい場合は、ネストの形で連結させることができます。

例
``CONCAT( CONCAT(FIRST, SECOND), THIRD)``

| FIRST    | SECOND  | THIRD  | RETURN_VALUE  |
|:---------|:--------|:-------|:--------------|
| 'Wishy'  | '-'     | 'Washy'| 'Wishy-Washy' |
| 'Johnny' | ' '     | 'Depp' | 'Johnny Depp' |
| 'Yes'    | 'Or'    | 'No'   | 'YesOrNo'     |

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-8DE0ACF9-3F18-4201-A559-CFE55B4A7D92.html

# IIF
　条件の結果に応じて、出力する値を変更する関数。

```ts
IIF( condition, value1, value2)
```
``condition``は、条件式。
``value1``は、条件がTRUEの時に出力されるデータ型。
``value2``は、条件がFALSEの時に出力されるデータ型。省略可能。
*value2*が省略されたときに条件がFALSEの場合、IIF関数は以下の値を返します。
・*value1*が数値データ型のときは、0。
・*value1*が文字列データ型のときは、空文字列。
・*value1*がDate/Timeデータ型のときは、NULL。

例
``IIF( NUMBER > 100, TRUE_VALUE, FALSE_VALUE)``

| NUMBER    | TRUE_VALUE            | FALSE_VALUE  | RETURN_VALUE      |
|:----------|:----------------------|:-------------|:------------------|
| 200       | 'SUCCESS'             | 'FAILURE'    | 'SUCCESS'         |
| 50        | 1000                  | (省略)       | 0                 |
| 50        | 'SUCCESS'             | (省略)       | ''*(empty string)*|
| 50        | 2022/04/02 12:00:00   | (省略)       | NULL              |
| 50        | 'CLEAR'               | NULL         | NULL              |

　ネストしたIIF文を作成することも可能です。

例
```ts
IIF( SALES > 0,
      --もしSALESの値が'1~49'までの時:
      IIF( SALES < 50,
            --SALARY1を返す
            SALARY1,
            --1~49ではなくSALESが'50~99'までの時:
            IIF( SALES < 100,
                  --SALARY2を返す
                  SALARY2,
                  --1~99ではなくSALESが'100~199'までの時:
                  IIF( SALES < 200,
                        --SALARY3を返す
                        SALARY3,
                        --1~199ではなくSALESが200以上の時, BONUSを返す
                        BONUS)
                  )
           ),
      --SALESが0以下の時, 0を返す
      0)
```

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-0D9974B2-F8C8-48AA-86CE-85AF33F84CCA.html

　しかし、ネストしたIIF文は御覧の通り煩雑になりやすいです。そこで、以下のDECODE関数を使うことで可読性の高いコードとして書き表すことができます。

# DECODE
　入力した値に応じて、出力する値を複数に分岐させる関数。
```ts
DECODE( input,
    first_condition, first_output,
    second_condition, second_output,
    third_condition, third_output,
    ///
    default
)
```

``input``は、検索対象となる値。
``first_condition``は、*input*の値を検索する条件式。
``first_output``は、*first_condition*で検索した結果がTRUEの時、出力する値。
*second_*, *third_*…以降は任意。
``default``は、検索した*condition*がどれも一致しないときに出力する値。省略可能。*default*が省略されたときに検索した値が一致しない場合、NULLを出力する。

　任意の*output*に関しては、型が一致しなければなりません。以下の例の場合、*output*にあたる値の型が数字型と文字列型が混在しているため、無効となります。
```ts
DECODE( COLOR,
    'Red', 1,
    'Blue', '2',
    'Yellow', 'Yellow',
    'Purple', 4 )
```

 上述のIIF文のネストをDECODE関数で表現すると以下の通りとなります。

```ts
DECODE( TRUE,
    0 < SALES AND SALES < 50, SALARY1,
    49 < SALES AND SALES < 100, SALARY2,
    99 < SALES AND SALES < 200, SALARY3,
    199 < SALES, BONUS)
```

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F/GUID-B4DDA460-ABA8-4162-8C49-67CFB3641259.html

# おわりに
　業務の中で使ったIICSのデータ統合処理のマッピングにおける「式」の関数をまとめました。関数は他にもたくさんあるので、公式ドキュメントを見ながたデータ処理に役立ててください。

https://docs.informatica.com/ja_jp/integration-cloud/cloud-data-integration/current-version/_function-reference_cloud-data-integration_current-version_ditamap/GUID-EA19702C-02B0-43D0-807B-D7FAE9BAEA9F.html