# 機能の違い

Availability-note[Beta](https://help.talend.com/r/en-US/Cloud/labels-on-talend-help-center/availability-beta)

ベータ版コンテンツ

次の機能は標準マップとDSQLマップの両方で使用できますが、動作が異なります。

## ループおよび部分文字列ファンクション内のインデックス

標準マップでは、LoopIndexファンクションを使ってループインデックスを参照できます。この場合、最初の出現のインデックスは1です。詳細は、[LoopIndex](https://help.qlik.com/talend/r/ja-JP/8.0/data-mapper-functions-reference-guide/loopindex-function)をご覧ください。

DSQLマップでは、FROM句でINDEXキーワードを使ってループインデックスを参照できます。この場合、最初の出現のインデックスは0です。詳細は、[FROM句を使う](https://help.qlik.com/talend/r/ja-JP/8.0/data-shaping-language-reference-guide/using-from-clause)をご覧ください。

部分文字列ファンクションにも同じ違いが当てはまります。[標準のSubstringファンクション](https://help.qlik.com/talend/r/ja-JP/8.0/data-mapper-functions-reference-guide/substring-function)では最初の文字のインデックスは1ですが、[DSQLのsubStringファンクション](https://help.qlik.com/talend/r/ja-JP/8.0/data-shaping-language-reference-guide/substring-function)では最初の文字のインデックスは0です。

## グルーピング

標準マップでは、SimpleLoopファンクションのDistinctファンクションを使ってエレメントをグルーピングできます。この機能によって、グループピングエレメントの値が入力データで見つかった順序でグループが返されます。詳細は、[SimpleLoop](https://help.qlik.com/talend/r/ja-JP/8.0/data-mapper-functions-reference-guide/simpleloop-function)をご覧ください。

DSQLマップでは、エレメントはGROUP BY句でグルーピングできます。グループは未定義の順序で返されます。詳細は、[GROUP BY句を使う](https://help.qlik.com/talend/r/ja-JP/8.0/data-shaping-language-reference-guide/using-group-by-clause)をご覧ください。

## ループの展開と分割

DSQLマップでは、ループを展開または分割した場合、新しく作成されるループは次の機能をサポートしていません:

* 変数を定義するLET句とSET句
* 条件式

これらの機能は引き続き元のループで使用できます。

## 文字列の書式設定

入力エレメントにNULL値があり、出力エレメントがNULLableでないとマークされた文字列である場合、標準マップは空の文字列を返します。DSQLマップでは、Nullable属性は無視され、NULL値が返されます。

## 数字の書式設定

* 入力データが数値制約に一致しない場合、標準マップでは警告を表示して処理を続行しますが、DSQLマップでは例外を表示して処理を停止します。
* 出力で数値が固定サイズの文字列として書式設定されている場合、標準マップではその値はスペースで右詰めにされますが、DSQLマップではゼロで左詰めにされます。
* DSQLマップでは、分数を含む数値表現はFloatデータ型を使って処理されます。出力エレメントが明示的なスケールを持たないDecimalとして定義されている場合、結果はFloatのスケールを保持します。これは標準マップの場合とは異なります。たとえば式の結果が0.20000000298023224であれば、DSQLマップはこの値を返しますが、標準マップは0.2を返します。DSQLマップでformatNumberファンクションを使えば、出力を書式設定できます。

## ネスト化された空の配列

ネスト化された配列での反復処理中に空の配列に遭遇した場合、標準マップとDSQLマップでは動作が異なります。

たとえば次のJSON入力では、レコードの配列を取得するためにこれをフラット化し、姓と名が1つずつ含まれているレコードの配列を取得することが目的です。

```
[
	{
		"lastname" : "Cruise",
		"firstnames" : [ "Tom", "Robert" ]
	},
	{
		"lastname" : "Ford",
		"firstnames" : [ ]
	}
]
```

標準マップでは、これはルート配列を反復処理するSimpleLoopファンクションと、firstnames配列を反復処理するSimpleLoopを持つNestedContextを使って行われます。このケースでは、マップが次の結果を返します:

```
[
  {
    "lastname": "Cruise",
    "firstname": "Tom"
  },
  {
    "lastname": "Cruise",
    "firstname": "Robert"
  },
  {
    "lastname": "Ford",
    "firstname": ""
  }
]
```

ただし、DSQLマップでFROM句の後にUNNEST句を使用すると、マップは以下の結果を返します:

```
[
   {
      "lastname": "Cruise",
      "firstname": "Tom"
   },
   {
      "lastname": "Cruise",
      "firstname": "Robert"
   }
]
```

DSQLマップの場合、対応するfirstnames配列が空である(つまり反復処理するものがなかった)ため、Fordというラストネームは無視されます。