

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

# AWS IoT SQL リファレンス
<a name="iot-sql-reference"></a>

では AWS IoT、ルールは SQL のような構文を使用して定義されます。SQL ステートメントは、次の 3 種類の句で構成されます。

**SET**  
(オプション) SQL ステートメントと置換テンプレート全体で再利用できる変数を定義します。式を使用して変数に値を割り当てます。これらの変数は、SELECT 句と WHERE 句、およびアクション置換テンプレートで参照します。  
SET 句は、[データ型](iot-sql-data-types.md)、[オペレータ](iot-sql-operators.md)、、[関数](iot-sql-functions.md)[リテラル](iot-sql-literals.md)、[Case ステートメント](iot-sql-case.md)、、[JSON 拡張](iot-sql-json.md)[変数](iot-sql-set.md#iot-sql-set-usage)、および をサポートします[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)。

**SELECT**  
(必須) 受信メッセージのペイロードから情報を抽出し、その情報に対して変換を実行します。使用するメッセージは、FROM 句で指定された[トピックフィルター](topics.md#topicfilters)によって識別されます。  
SELECT 句は、[データ型](iot-sql-data-types.md)、、[オペレータ](iot-sql-operators.md)、[関数](iot-sql-functions.md)、[リテラル](iot-sql-literals.md)[Case ステートメント](iot-sql-case.md)、[JSON 拡張](iot-sql-json.md)、[置換テンプレート](iot-substitution-templates.md)、[変数](iot-sql-set.md#iot-sql-set-usage)、[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)、および をサポートします[バイナリペイロード](binary-payloads.md)。

**FROM**  
データを抽出するメッセージを識別する MQTT メッセージ[トピックフィルター](topics.md#topicfilters)。ここで指定されたトピックフィルタに一致する MQTT トピックに送信されるメッセージごとに、ルールがアクティブ化されます。メッセージブローカーを通過するメッセージによってアクティブ化されるルールに必要です。[基本的な取り込み](iot-basic-ingest.md)機能を使用してのみアクティブ化されるルールの場合はオプションです。

**WHERE**  
(オプション) ルールで指定されたアクションが実行されるかどうかを決定する条件付きロジックを追加します。  
WHERE 句は、[データ型](iot-sql-data-types.md)、、[オペレータ](iot-sql-operators.md)、[関数](iot-sql-functions.md)[リテラル](iot-sql-literals.md)、[Case ステートメント](iot-sql-case.md)、[JSON 拡張](iot-sql-json.md)、[変数](iot-sql-set.md#iot-sql-set-usage)、および をサポートします[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)。

SQL ステートメントの例は、次のようになります。

```
SELECT color AS rgb FROM 'topic/subtopic' WHERE temperature > 50
```

MQTT メッセージ (入力ペイロードとも呼ばれる) の例は、次のようになります。

```
{
    "color":"red",
    "temperature":100
}
```

このメッセージが `'topic/subtopic'` トピックに発行された場合、ルールはトリガーされ、SQL ステートメントは評価されます。SQL ステートメントでは、`color` プロパティが 50 より大きい場合は、`"temperature"` プロパティの値を抽出します。WHERE 句は、条件 `temperature > 50` を指定します。`AS` キーワードは `"color"` プロパティの名前を `"rgb"` に変更します。結果は、(*出力ペイロード*とも呼ばれる) 次のようになります。

```
{
    "rgb":"red"
}
```

このデータは、さらなる処理のためにデータを送信するルールアクションに転送されます。ルールアクションの詳細については、「[AWS IoT ルールアクション](iot-rule-actions.md)」を参照してください。

**注記**  
コメントは、現在 AWS IoT SQL 構文ではサポートされていません。  
空白を含む属性名は、SQL ステートメントのフィールド名として使用できません。受信ペイロードにはスペースを含む属性名を使用できますが、SQL ステートメントではそのような名前を使用できません。ただし、ワイルドカード (\$1) フィールド名指定を使用すると、送信ペイロードに渡されます。

# SELECT 句
<a name="iot-sql-select"></a>

 AWS IoT SELECT 句は基本的に ANSI SQL SELECT 句と同じですが、いくつかの小さな違いがあります。

SELECT 句は、[データ型](iot-sql-data-types.md)、、[オペレータ](iot-sql-operators.md)、[関数](iot-sql-functions.md)[リテラル](iot-sql-literals.md)、[Case ステートメント](iot-sql-case.md)、[JSON 拡張](iot-sql-json.md)、[変数](iot-sql-set.md#iot-sql-set-usage)、[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)、および をサポートします[バイナリペイロード](binary-payloads.md)。

SELECT 句を使用して、受信 MQTT メッセージから情報を抽出できます。`SELECT *` を使用して、受信メッセージのペイロード全体を取得することもできます。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic': {"color":"red", "temperature":50}
SQL statement: SELECT * FROM 'topic/subtopic'
Outgoing payload: {"color":"red", "temperature":50}
```

ペイロードが JSON オブジェクトの場合、オブジェクトのキーを参照できます。出力ペイロードにはキーと値のペアが含まれます。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic': {"color":"red", "temperature":50}
SQL statement: SELECT color FROM 'topic/subtopic'
Outgoing payload: {"color":"red"}
```

AS キーワードを使用してキーの名前を変更できます。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic':{"color":"red", "temperature":50}
SQL:SELECT color AS my_color FROM 'topic/subtopic'
Outgoing payload: {"my_color":"red"}
```

カンマで区切ることで、複数の項目を選択できます。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic': {"color":"red", "temperature":50}
SQL: SELECT color as my_color, temperature as fahrenheit FROM 'topic/subtopic'
Outgoing payload: {"my_color":"red","fahrenheit":50}
```

「\$1」を含む複数の項目を選択して、受信ペイロードに項目を追加できます。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic': {"color":"red", "temperature":50}
SQL: SELECT *, 15 as speed FROM 'topic/subtopic'
Outgoing payload: {"color":"red", "temperature":50, "speed":15}
```

`"VALUE"` キーワードを使用して、JSON オブジェクトではない出力ペイロードを作成できます。SQL バージョン `2015-10-08` では、選択できる項目は 1 つのみです。SQL バージョン `2016-03-23` 以降では、最上位オブジェクトとして出力する配列を選択することもできます。

**Example**  

```
Incoming payload published on topic 'topic/subtopic': {"color":"red", "temperature":50}
SQL: SELECT VALUE color FROM 'topic/subtopic'
Outgoing payload: "red"
```

`'.'` 構文を使用して、受信ペイロードで入れ子になっている JSON オブジェクトを詳細に調べることができます。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic': {"color":{"red":255,"green":0,"blue":0}, "temperature":50}
SQL: SELECT color.red as red_value FROM 'topic/subtopic'
Outgoing payload: {"red_value":255}
```

数字やハイフン (マイナス) 文字などの予約文字を含む JSON オブジェクトおよびプロパティ名の使用方法については、「[JSON 拡張](iot-sql-json.md)」を参照してください。

関数を使用して受信ペイロードを変換できます ([関数](iot-sql-functions.md) を参照)。グループ化するには括弧を使用します。以下に例を示します。

```
Incoming payload published on topic 'topic/subtopic': {"color":"red", "temperature":50}
SQL: SELECT (temperature - 32) * 5 / 9 AS celsius, upper(color) as my_color FROM 'topic/subtopic'
Outgoing payload: {"celsius":10,"my_color":"RED"}
```

# FROM 句
<a name="iot-sql-from"></a>

FROM 句はルールを[トピック](topics.md#topicnames)や[トピックのフィルター](topics.md#topicfilters)に受信登録します。トピックまたはトピックフィルタは、一重引用符 (') で囲みます。ここで指定されたトピックフィルタに一致する MQTT トピックに送信されるメッセージごとに、ルールがトリガーされます。トピックのフィルタを使って、類似のトピックのグループにサブスクライブできます。

**例**:

トピックに公開された受信ペイロード `'topic/subtopic'`: `{temperature: 50}`。

トピックに公開された受信ペイロード `'topic/subtopic-2'`: `{temperature: 50}`。

SQL: `"SELECT temperature AS t FROM 'topic/subtopic'"`。

ルールが `'topic/subtopic'` に受信登録されるため、受信ペイロードがルールに渡されます。ルールアクションに渡される発信ペイロードは、`{t: 50}` です。ルールが `'topic/subtopic-2'` に受信登録されていないので、ルールは `'topic/subtopic-2'` で公開されるメッセージにトリガーされません。

**\$1 ワイルドカードの例:**

「\$1」(複数レベル) ワイルドカード文字を使用して、1 つ以上の特定のパス要素に一致させることができます。

トピックに公開された受信ペイロード `'topic/subtopic'`: `{temperature: 50}`。

トピックに公開された受信ペイロード `'topic/subtopic-2'`: `{temperature: 60}`。

トピックに公開された受信ペイロード `'topic/subtopic-3/details'`: `{temperature: 70}`。

トピックに公開された受信ペイロード `'topic-2/subtopic-x'`: `{temperature: 80}`。

SQL: `"SELECT temperature AS t FROM 'topic/#'"`。

ルールは `'topic'` で始まるすべてのトピックにサブスクライブされるため、3 回実行され、`{t: 50}` (topic/subtopic)、`{t: 60}` (topic/subtopic-2)、および `{t: 70}` (topic/subtopic-3/details) の送信ペイロードがアクションに送信されます。`'topic-2/subtopic-x'` に受信登録されていないので、`{temperature: 80}` のメッセージにルールはトリガーされません。

**\$1 ワイルドカードの例:**

「\$1」(単数レベル) ワイルドカード文字を使用して、1 つの特定のパス要素に一致させることができます。

トピックに公開された受信ペイロード `'topic/subtopic'`: `{temperature: 50}`。

トピックに公開された受信ペイロード `'topic/subtopic-2'`: `{temperature: 60}`。

トピックに公開された受信ペイロード `'topic/subtopic-3/details'`: `{temperature: 70}`。

トピックに公開された受信ペイロード `'topic-2/subtopic-x'`: `{temperature: 80}`。

SQL: `"SELECT temperature AS t FROM 'topic/+'"`。

ルールは、2 つのパス要素のあるすべてのトピックに受信登録されていて、最初の要素は `'topic'` です。ルールは `'topic/subtopic'` および `'topic/subtopic-2'`に送信されたメッセージに対して実行されますが、`'topic/subtopic-3/details'` (トピックフィルターよりも多くのレベルがある) または `'topic-2/subtopic-x'` (`topic` で始まらない) に対しては実行されません。

# SET 句
<a name="iot-sql-set"></a>

SET 句を使用して、式の結果を保存する変数を定義します。これらの変数は、SELECT 句と WHERE 句、および置換テンプレートで再利用できます。これにより、複雑な式が重複するのを防ぎ、SQL ステートメント内の関数呼び出しの数を減らすことができます。

SET 句は、[データ型](iot-sql-data-types.md)、[オペレータ](iot-sql-operators.md)、、[関数](iot-sql-functions.md)[リテラル](iot-sql-literals.md)、[Case ステートメント](iot-sql-case.md)、、[JSON 拡張](iot-sql-json.md)[変数](#iot-sql-set-usage)、および をサポートします[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)。

## SET 句構文
<a name="iot-sql-set-syntax"></a>

SET 句は、SQL ステートメントの SELECT 句の前に表示する必要があります。次の構文を使用します。

```
SET @variable_name = expression [, @variable_name2 = expression2]
```

構文ルール:
+ で変数名を開始する `@`
+ 変数名には、文字、数字、アンダースコアを含めることができます
+ 変数名は最大 64 文字です
+ 複数の変数をカンマで区切って 1 つの SET 句に設定できます。
+ 各変数を割り当てることができるのは 1 回のみです (変数はイミュータブルです)
+ SET キーワードは SQL ステートメントごとに 1 回のみ使用できます

## 変数の使用
<a name="iot-sql-set-usage"></a>

変数を定義したら、次の場所で使用できます。
+ SELECT 句
+ WHERE 句
+ その他の SET 変数の割り当て
+ アクション置換テンプレート
+ エラーアクション置換テンプレート
+ ネストされた SELECT クエリ
+ 関数パラメータ (roleArn パラメータなどの特定のパラメータ、および のような関数のモードを切り替えるパラメータは変数をサポート`transform("enrichArray", attributes, values)`していません)

変数は、SET 句で使用されるのと同じ`@variable_name`構文を使用して参照されます。JSON 拡張構文を使用して、 などのオブジェクトを含む変数のプロパティにアクセスすることもできます`@variable_name.property`。

## SET 句の例
<a name="iot-sql-set-examples"></a>

**基本的な変数の使用法**

次の例は、トピック で公開されたペイロードを示しています`device/data`。 `{"temp_fahrenheit": 75, "humidity": 60}`

SQL ステートメント:

```
SET @temp_celsius = (temp_fahrenheit - 32) * 5 / 9
SELECT @temp_celsius AS celsius, humidity FROM 'device/data'
```

送信ペイロード: `{"celsius": 23.89, "humidity": 60}`

**埋め込み JSON オブジェクトのメンバーにアクセスする **

次の例は、トピック で公開されたペイロードを示しています`device/data`。 `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

SQL ステートメント:

```
SET @device_sensor_data = device1.deviceData.sensors
SELECT @device_sensor_data.temp_fahrenheit AS temp_fahrenheit, @device_sensor_data.humidity as humidity, device1.deviceId as deviceId FROM 'device/data'
```

送信ペイロード: `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 JSON 拡張機能の操作方法の詳細については、「」を参照してください。 [JSON 拡張](iot-sql-json.md)

**重複する関数呼び出しの回避**

SET 変数は、複雑なデコードオペレーションの重複を回避するのに役立ちます。

```
SET @decoded_data = decode(encode(*, 'base64'), 'proto', 'schema', 'schema.desc', 'message.proto', 'Message')
SELECT @decoded_data.sensor_id, @decoded_data.reading FROM 'device/protobuf' 
WHERE @decoded_data.reading > 100
```

SET 変数がない場合、関数呼び出し制限を超えるデコード関数を 3 回繰り返す必要があります。

**複数の変数**

複数の変数をカンマで区切ることで、1 つの SET 句で定義できます。

```
SET @user_data = get_user_properties(device_id), @threshold = 50
SELECT @user_data.name, temp_fahrenheit FROM 'sensors/+'
WHERE temp_fahrenheit > @threshold AND @user_data.active = true
```

**置換テンプレートでの変数の使用**

変数はアクション置換テンプレートでも使用できます。これにより、SQL ステートメントとルールアクションの両方で計算された値を再利用できます。

SQL ステートメント:

```
SET @temp_celsius = (temp_fahrenheit - 32) * 5 / 9
SELECT @temp_celsius AS celsius, humidity FROM 'device/data'
```

アクション設定:

```
{
  "s3": {
    "roleArn": "arn:aws:iam::123456789012:role/testRuleRole",
    "bucketName": "bucket",
    "key": "temperature-data/${device_id}/temp-${@temp_celsius}C.json"
  }
}
```

この例では、SET 変数`@temp_celsius`が置換テンプレートで使用され、S3 アクションのキーフィールドが作成されます。

**JSON 以外のペイロードの使用**

SET 変数は JSON 以外のペイロードを直接サポートしないため、ペイロードは最初にエンコードまたはデコードする必要があります。

```
SET @encoded_payload = encode(*, 'base64')
SELECT @encoded_payload AS raw_data FROM 'device/binary'
```

 JSON 以外のペイロードの操作方法の詳細については、「」を参照してください。 [バイナリペイロードの使用](binary-payloads.md)

## SET 句の制限
<a name="iot-sql-set-limits"></a>

SET 変数には、次の制限が適用されます。
+ SQL ステートメントあたり最大 10 個の一意の変数
+ 最大変数値サイズは 128 KiB (UTF-8 JSON 文字列の最小化)
+ すべての変数の最大合計値サイズは 128 KiB です
+ 変数名は 64 文字に制限されています
+ 変数は JSON ペイロードをそのまま直接受け入れることができます (JSON 以外のペイロードは最初にエンコード/デコードする必要があります)

# WHERE 句
<a name="iot-sql-where"></a>

WHERE 句は、ルールで指定されたアクションが実行されるかどうかを決定します。WHERE 句が true と評価する場合、ルールアクションが実行されます。それ以外の場合、ルールアクションは実行されません。

WHERE 句は、[データ型](iot-sql-data-types.md)、、[オペレータ](iot-sql-operators.md)、[関数](iot-sql-functions.md)[リテラル](iot-sql-literals.md)、[Case ステートメント](iot-sql-case.md)、[JSON 拡張](iot-sql-json.md)、[変数](iot-sql-set.md#iot-sql-set-usage)、および をサポートします[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)。

**例**:

`topic/subtopic` に公開された受信ペイロード: `{"color":"red", "temperature":40}`。

SQL: `SELECT color AS my_color FROM 'topic/subtopic' WHERE temperature > 50 AND color <> 'red'`。

この場合、ルールはトリガーされますが、ルールで指定されたアクションは実行されません。出力ペイロードはありません。

WHERE 句の関数と演算子を使用できます。ただし、SELECT に AS キーワードで作成されたエイリアスを参照することはできません。(SELECT が評価されたかどうかを判断するため、WHERE 句は最初に評価されます。) 

**非 JSON ペイロードのある例:**

`topic/subtopic` で公開された受信非 JSON ペイロード: `80`

SQL: ``SELECT decode(encode(*, 'base64'), 'base64') AS value FROM 'topic/subtopic' WHERE decode(encode(*, 'base64'), 'base64') > 50`

この場合、ルールはトリガーされますが、ルールで指定されたアクションは実行されません。送信ペイロードは SELECT 句によって JSON ペイロード `{"value":80}` として変換されます。

# データ型
<a name="iot-sql-data-types"></a>

 AWS IoT ルールエンジンは、すべての JSON データ型をサポートしています。


**サポートされているデータの種類**  

| タイプ | 意味 | 
| --- | --- | 
| Int | 個別の Int。最大 34 桁。 | 
| Decimal |  0 以外の最小サイズ 1E-999 および最大サイズ 9.999...E999 の、精度が 34 桁の `Decimal`。  一部の関数は、34 桁の精度ではなく、倍精度の `Decimal` の値を返します。 SQL V2 (2016-03-23) では、`10.0` などの整数である数値は、想定される `Decimal` 値 (`10.0`) ではなく `Int` 値 (`10`) として処理されます。整数の数値を `Decimal` 値として確実に処理するには、ルールクエリステートメントに SQL V1 (2015-10-08) を使用します。   | 
| Boolean | True-または-False | 
| String | A UTF-8 文字列。 | 
| Array | 同じ型を持つ必要のない一連の値。 | 
| Object | キーと値で構成される JSON 値。キーは文字列である必要があります。値は任意のタイプにできます。 | 
| Null | Null JSON で定義されます。値がないことを表す、実際の値です。SQL ステートメントの Null キーワードを使用して、Null の値を明示的に作成できます。例: "SELECT NULL AS n FROM 'topic/subtopic'"  | 
| Undefined |  値ではなく。値を省略しない限り、これは、JSON では明示的には表現できません。たとえば、`{"foo": null}` のオブジェクトでは、キー「foo」は NULL を返しますが、キー「bar」は `Undefined` を返します。内部的には、SQL 言語は、`Undefined` を値として処理しますが、JSON では表現ができないため、JSON にシリアル化される場合は、結果は `Undefined` になります。 <pre> {"foo":null, "bar":undefined} </pre> JSON に以下のようにシリアル化されます。 <pre> {"foo":null}</pre> 同様に、単独でシリアル化すると、`Undefined` は空の文字列に変換されます。無効な引数 (例: 間違った種類、間違った数値の引数など) を使用して呼び出された関数は `Undefined` を返します。  | 

## 変換
<a name="iot-sql-conversions"></a>

次の表では 1 つのタイプの値が別のタイプに変換されると (正しくない型の値が関数に付与された場合) 結果を表示します。たとえば、絶対値関数「abs」 (`Int` または `Decimal` を想定します) が `String` に与えられると、以下のルールにしたがって、`String` を `Decimal` に変換するように試みます。この場合、「abs("-5.123")」は「abs(-5.123)」として処理されます。

**注記**  
`Array`、`Object`、`Null`、`Undefined` へ試みられた変換はありません。


**Decimal に**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 小数点のない Decimal。 | 
| Decimal | ソース値。 | 
| Boolean | Undefined。(キャスト関数を明示的に使用して、true = 1.0、false = 0.0. を変換できます。) | 
| String | SQL エンジンは、文字列を Decimal. AWS IoT attempts として解析し、正規表現に一致する文字列を解析しようとします^-?\$1d\$1(\$1.\$1d\$1)?((?i)E-?\$1d\$1)?\$1。「0」、「-1.2」、「5E-12」は、Decimal に自動的に変換される文字列の例です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Null. | 
| 未定義 | Undefined. | 


**Int に**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | ソース値。 | 
| Decimal | 最も近い Int に丸められたソース値。 | 
| Boolean | Undefined。(キャスト関数を明示的に使用して、true = 1.0、false = 0.0. を変換できます。) | 
| String |  SQL エンジンは、文字列を Decimal. AWS IoT attempts として解析し、正規表現に一致する文字列を解析しようとします^-?\$1d\$1(\$1.\$1d\$1)?((?i)E-?\$1d\$1)?\$1。「0」、「-1.2」、「5E-12」はすべて、 を String に変換するために Decimals. AWS IoT attempts に自動的に変換されDecimal、その小数点以下を切り捨てDecimalて を作成しますInt。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Null. | 
| 未定義 | Undefined. | 


**ブールに**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Undefined (cast 関数を明示的に使用して、0 = False、any\$1nonzero\$1value = True を変換できます)。 | 
| Decimal | Undefined (キャスト関数を明示的に使用して、0 = False、any\$1nonzero\$1value = True を変換できます)。 | 
| Boolean | 元の値。 | 
| String | "true" = True および "false" = False (大文字小文字の区別なし)。その他の文字列値 = Undefined。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 


**文字列に**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 標準表記の Int の文字列表現。 | 
| Decimal | おそらく科学的表記での Decimal 値の文字列表現。 | 
| Boolean | "true" または "false"。すべて小文字。 | 
| String | 元の値。 | 
| 配列 | JSON にシリアル化された Array。結果として生じる文字列は、角括弧で囲まれたカンマ区切りリストです。String は引用符で囲まれます。Decimal、Int、Boolean、Null は引用符で囲まれません。 | 
| オブジェクト | JSON にシリアル化されたオブジェクト。結果として生じる文字列は、キーと値のペアのカンマ区切りリストで、中括弧で開始し、終了します。String は引用符で囲まれます。Decimal、Int、Boolean、Null は引用符で囲まれません。 | 
| Null | Undefined. | 
| 未定義 | 未定義。 | 

# オペレータ
<a name="iot-sql-operators"></a>

次の演算子は、SELECT 句および WHERE 句で使用できます。

## AND 演算子
<a name="iot-sql-operators-and"></a>

`Boolean` の結果を返します。論理 AND 演算を実行します。左右オペランドが true の場合は true を返します｡ それ以外の場合は、false を返します。`Boolean` オペランド、または、大文字小文字を区別しない「true」または「false」文字列オペランドが必要です。

*構文:* ` expression AND expression`


**AND 演算子**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Boolean | Boolean | Boolean。両方のオペランドが true の場合は true。それ以外の場合は、false を返します。 | 
| String/Boolean | String/Boolean | すべての文字列が「true」または「false」 (大文字と小文字が区別されません) の場合、それらは Boolean に変換され、boolean AND boolean として、正常に処理されます。 | 
| その他の値 | その他の値 | Undefined. | 

## OR 演算子
<a name="iot-sql-operators-or"></a>

`Boolean` の結果を返します。論理 OR 演算を実行します。左または右オペランドのいずれかが true の場合 true を返します。それ以外の場合は、false を返します。`Boolean` オペランド、または、大文字小文字を区別しない「true」または「false」文字列オペランドが必要です。

*構文:* ` expression OR expression`


**OR 演算子**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Boolean | Boolean | Boolean。どちらかのオペランドが true の場合は true。それ以外の場合は、false を返します。 | 
| String/Boolean | String/Boolean | すべての文字列が「true」または「false」 (大文字と小文字が区別されません) の場合、それらはブール値に変換され、boolean OR boolean として、正常に処理されます。 | 
| その他の値 | その他の値 | Undefined. | 

## NOT 演算子
<a name="iot-sql-operators-not"></a>

`Boolean` の結果を返します。論理 NOT 演算を実行します。オペランドが false の場合は true を返します｡ それ以外の場合は true を返します。`Boolean` オペランド、または、大文字小文字を区別しない「true」または「false」文字列オペランドが必要です。

*構文:* `NOT expression`


**NOT 演算子**  

| オペランド | 出力 | 
| --- | --- | 
| Boolean | Boolean。オペランドが false の場合は true｡ それ以外の場合は、true。 | 
| String | 文字列が「true」または「false」 (大文字と小文字は区別されません) の場合は、対応するブール値に変換され、反対の値は返されます。 | 
| その他の値 | Undefined. | 

## IN 演算子
<a name="iot-sql-operators-in"></a>

`Boolean` の結果を返します。WHERE 句の IN 演算子を使用して、値が配列内の値と一致するかどうかを確認できます。一致が見つかった場合は true、それ以外の場合は false を返します。

*構文:* ` expression IN expression`


**IN 演算子**  

| 左のオペランド | 右のオペランド | Output | 
| --- | --- | --- | 
| Int/Decimal/String/Array/Object | Array | Integer/Decimal/String/Array/Object 要素が配列で見つかった場合は true。それ以外の場合は、false を返します。 | 

*例*:

```
SQL: "select * from 'a/b' where 3 in arr"

JSON: {"arr":[1, 2, 3, "three", 5.7, null]}
```

この例では、`arr` という名前の配列に 3 が存在するため、条件句 `where 3 in arr` は true に評価されます。したがって、SQL ステートメントでは、`select * from 'a/b'` が実行されます。この例は、配列が異種である可能性も示しています。

## EXISTS 演算子
<a name="iot-sql-operators-exists"></a>

`Boolean` の結果を返します。EXISTS 演算子を条件句で使用して、サブクエリ内の要素の存在をテストできます。サブクエリが 1 つ以上の要素を返す場合は true を返し、サブクエリが要素を返さない場合は false を返します。

*構文:* ` expression`

*例*:

```
SQL: "select * from 'a/b' where exists (select * from arr as a where a = 3)"

JSON: {"arr":[1, 2, 3]}
```

この例では、`arr` という名前の配列に 3 が存在するため、条件句 `where exists (select * from arr as a where a = 3)` は true に評価されます。したがって、SQL ステートメントでは、`select * from 'a/b'` が実行されます。

*例*:

```
SQL: select * from 'a/b' where exists (select * from e as e where foo = 2)

JSON: {"foo":4,"bar":5,"e":[{"foo":1},{"foo":2}]}
```

この例では、JSON オブジェクト内の配列 `e` にオブジェクト `{"foo":2}` が含まれているため、条件句 `where exists (select * from e as e where foo = 2)` は true に評価されます。したがって、SQL ステートメントでは、`select * from 'a/b'` が実行されます。

## > operator
<a name="iot-sql-operators-greater"></a>

`Boolean` の結果を返します。左のオペランドが右のオペランドより大きい場合は true を返します。両方のオペランドが、`Decimal` に変換され、比較されます。

*構文:* `expression > expression`


**> operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int/Decimal | Int/Decimal | Boolean。左のオペランドが右のオペランドより大きい場合は true。それ以外の場合は、false を返します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列を Decimal に変換できると、その後は Boolean です。左のオペランドが右のオペランドより大きい場合は true を返します。それ以外の場合は、false を返します。 | 
| その他の値 | Undefined. | Undefined. | 

## >= operator
<a name="iot-sql-operators-greater-equal"></a>

`Boolean` の結果を返します。左のオペランドが右のオペランド以上の場合は true を返します。両方のオペランドが、`Decimal` に変換され、比較されます。

*構文:* `expression >= expression`


**>= operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int/Decimal | Int/Decimal | Boolean。左のオペランドが右のオペランド以上の場合は true。それ以外の場合は、false を返します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列を Decimal に変換できると、その後は Boolean です。左のオペランドが右のオペランド以上の場合は true を返します。それ以外の場合は、false を返します。 | 
| その他の値 | Undefined. | Undefined. | 

## < 演算子
<a name="iot-sql-operators-less"></a>

`Boolean` の結果を返します。左のオペランドが右のオペランド未満の場合は true を返します。両方のオペランドが、`Decimal` に変換され、比較されます。

*構文:* `expression < expression`


**< 演算子**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int/Decimal | Int/Decimal | Boolean。左のオペランドが右のオペランド未満の場合は true。それ以外の場合は、false を返します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列を Decimal に変換できると、その後は Boolean です。左のオペランドが右のオペランド未満の場合は true を返します。それ以外の場合は、false を返します。 | 
| その他の値 | Undefined | Undefined | 

## <= 演算子
<a name="iot-sql-operators-less-equal"></a>

`Boolean` の結果を返します。左のオペランドが右のオペランド以下の場合は true を返します。両方のオペランドが、`Decimal` に変換され、比較されます。

*構文:* `expression <= expression`


**<= 演算子**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int/Decimal | Int/Decimal | Boolean。左のオペランドが右のオペランド以下の場合は true。それ以外の場合は、false を返します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列を Decimal に変換できると、その後は Boolean です。左のオペランドが右のオペランド以下の場合は true を返します。それ以外の場合は、false を返します。 | 
| その他の値 | Undefined | Undefined | 

## <> 演算子
<a name="iot-sql-operators-not-eq"></a>

`Boolean` の結果を返します。左右オペランドの両方が等しくない場合に true を返します｡ それ以外の場合は、false を返します。

*構文:* ` expression <> expression`


**<> 演算子**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | 左のオペランドが右のオペランドと等しくなかったら true。それ以外の場合は、false を返します。 | 
| Decimal | Decimal | 左のオペランドが右のオペランドと等しくなかったら true。それ以外の場合は、false を返します。Int は比較される前に Decimal に変換されます。 | 
| String | String | 左のオペランドが右のオペランドと等しくなかったら true。それ以外の場合は、false を返します。 | 
| 配列 | 配列 | 各オペランドの項目が等しくなく、同じ順序でない場合、true。それ以外の場合は、false を返します。 | 
| オブジェクト | オブジェクト | 各オペランドのキーと値が等しくなかったら true。それ以外の場合は、false を返します。キーと値の順序は重要でありません。 | 
| Null | Null | False。 | 
| 任意の値 | Undefined | 未定義。 | 
| Undefined | 任意の値 | 未定義。 | 
| 不一致の型 | 不一致の型 | True。 | 

## = operator
<a name="iot-sql-operators-eq"></a>

`Boolean` の結果を返します。左右オペランドの両方が等しい場合に true を返します｡ それ以外の場合は、false を返します。

*構文:* ` expression = expression`


**= operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | 左のオペランドが右のオペランドと等しかったら true。それ以外の場合は、false を返します。 | 
| Decimal | Decimal | 左のオペランドが右のオペランドと等しかったら true。それ以外の場合は、false を返します。Int は比較される前に Decimal に変換されます。 | 
| String | String | 左のオペランドが右のオペランドと等しかったら true。それ以外の場合は、false を返します。 | 
| 配列 | 配列 | 各オペランドの項目が等しく、同じ順序の場合、true。それ以外の場合は、false を返します。 | 
| オブジェクト | オブジェクト | 各オペランドのキーと値が等しかったら true。それ以外の場合は、false を返します。キーと値の順序は重要でありません。 | 
| 任意の値 | Undefined | Undefined. | 
| Undefined | 任意の値 | Undefined. | 
| 不一致の型 | 不一致の型 | False。 | 

## \$1 operator
<a name="iot-sql-operators-plus"></a>

「\$1」は、オーバーロードされた演算子です。文字列の連結または追加に使用できます。

*構文:* ` expression + expression`


**\$1 operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| String | 任意の値 | 右のオペランドを文字列に変換してから、左のオペランドの末尾に連結します。 | 
| 任意の値 | String | 左のオペランドを文字列に変換して、右のオペランドを変換された左のオペランドの末尾に連結します。 | 
| Int | Int | Int 値。オペランドを共に追加します。 | 
| Int/Decimal | Int/Decimal | Decimal 値。オペランドを共に追加します。 | 
| その他の値 | その他の値 | Undefined. | 

## - operator
<a name="iot-sql-operators-sub"></a>

左のオペランドから右のオペランドを減算します。

*構文:* ` expression - expression`


**- operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | Int 値。左のオペランドから右のオペランドを減算します。 | 
| Int/Decimal | Int/Decimal | Decimal 値。左のオペランドから右のオペランドを減算します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列が小数に正しく変換されると、Decimal の値が返されます。左のオペランドから右のオペランドを減算します。それ以外の場合は Undefined を返します。 | 
| その他の値 | その他の値 | Undefined. | 
| その他の値 | その他の値 | Undefined. | 

## \$1 operator
<a name="iot-sql-operators-mult"></a>

左のオペランドを右のオペランドで乗算します。

*構文:* ` expression * expression`


**\$1 operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | Int 値。左のオペランドを右のオペランドで乗算します。 | 
| Int/Decimal | Int/Decimal | Decimal 値。左のオペランドを右のオペランドで乗算します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列が小数に正しく変換されると、Decimal の値が返されます。左のオペランドを右のオペランドで乗算します。それ以外の場合は Undefined を返します。 | 
| その他の値 | その他の値 | Undefined. | 

## / operator
<a name="iot-sql-operators-div"></a>

左のオペランドを右のオペランドで除算します。

*構文:* ` expression / expression`


**/ operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | Int 値。左のオペランドを右のオペランドで除算します。 | 
| Int/Decimal | Int/Decimal | Decimal 値。左のオペランドを右のオペランドで除算します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列が小数に正しく変換されると、Decimal の値が返されます。左のオペランドを右のオペランドで除算します。それ以外の場合は Undefined を返します。 | 
| その他の値 | その他の値 | Undefined. | 

## % operator
<a name="iot-sql-operators-mod"></a>

左のオペランドを右のオペランドで除算した剰余を返します。

*構文:* ` expression % expression`


**% operator**  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | Int 値。左のオペランドを右のオペランドで除算した剰余を返します。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列が小数に正しく変換されると、Decimal の値が返されます。左のオペランドを右のオペランドで除算した剰余を返します。そうでない場合は、Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

# 関数
<a name="iot-sql-functions"></a>

SQL 式の SELECT 句または WHERE 句では、以下の組み込み関数を使用できます。

次の外部関数は、ルールアクションの関数と同等に請求されます: [https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-func-aws-lambda](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-func-aws-lambda)、[https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-get-dynamodb](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-get-dynamodb)、[https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-get-registry_data](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-get-registry_data)、および [https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-get-thing-shadow](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-function-get-thing-shadow)。また、[Protobuf メッセージを JSON にデコード](https://docs.aws.amazon.com//iot/latest/developerguide/binary-payloads.html#binary-payloads-protobuf)している場合にのみ、[https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-decode-base64](https://docs.aws.amazon.com//iot/latest/developerguide/iot-sql-functions.html#iot-sql-decode-base64) 関数に対して課金されます。詳細については、[AWS IoT Core 料金表のページ](https://aws.amazon.com/iot-core/pricing/)を参照してください。

## abs(10 進数)
<a name="iot-func-abs"></a>

数値の絶対値を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `abs(-5)` は 5 を返します。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Int、引数の絶対値。 | 
| Decimal | Decimal、引数の絶対値。 | 
| Boolean | Undefined. | 
| String | Decimal。結果は、引数の絶対値です。文字列が変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## accountid()
<a name="iot-sql-function-accountid"></a>

`String` としてこのルールを所有するアカウントの ID を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`accountid() ` = "123456789012"

## acos(10 進数)
<a name="iot-func-acos"></a>

数値の逆コサインをラジアンで返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `acos(0)` = 1.5707963267948966 


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数の逆コサイン。仮想上の結果は、Undefined として返されます。 | 
| Decimal | Decimal 「倍精度で」、引数の逆コサイン。仮想上の結果は、Undefined として返されます。 | 
| Boolean | Undefined. | 
| String | Decimal、引数の逆コサイン。文字列が変換できない場合、結果は Undefined です。仮想上の結果は、Undefined として返されます。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## asin(10 進数)
<a name="iot-func-asin"></a>

数値の逆サインをラジアンで返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `asin(0)` = 0.0


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度」、引数の逆サイン。仮想上の結果は、Undefined として返されます。 | 
| Decimal | Decimal 「倍精度」、引数の逆サイン。仮想上の結果は、Undefined として返されます。 | 
| Boolean | Undefined. | 
| String | Decimal 「倍精度」、引数の逆サイン。文字列が変換できない場合、結果は Undefined です。仮想上の結果は、Undefined として返されます。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## atan(10 進数)
<a name="iot-func-atan"></a>

数値の逆タンジェントをラジアンで返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `atan(0)` = 0.0


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数の逆タンジェント。仮想上の結果は、Undefined として返されます。 | 
| Decimal | Decimal 「倍精度で」、引数の逆タンジェント。仮想上の結果は、Undefined として返されます。 | 
| Boolean | Undefined. | 
| String | Decimal、引数の逆タンジェント。文字列が変換できない場合、結果は Undefined です。仮想上の結果は、Undefined として返されます。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## atan2(10 進数、10 進数)
<a name="iot-func-atan2"></a>

正の X 軸と 2 つの引数で定義された点 (x、y) の間の角度をラジアンで返します。 反時計回りの角度では正で (上半面、y > 0)、時計回りの角度では負です (下反面、y < 0)。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `atan2(1, 0)` = 1.5707963267948966


****  

| 引数の型 | 引数の型 | 結果 | 
| --- | --- | --- | 
| Int/Decimal | Int/Decimal | Decimal (倍精度で)、X 軸と指定した点 (x、y) の間の角度。 | 
| Int/Decimal/String | Int/Decimal/String | Decimal、示された点の逆タンジェント。文字列が変換できない場合、結果は Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## aws\$1lambda(functionArn, inputJson)
<a name="iot-func-aws-lambda"></a>

 `inputJson` を Lambda 関数に渡して指定された Lambda 関数を呼び出し、Lambda 関数で生成された JSON を返します。


**引数**  

| 引数 | 説明 | 
| --- | --- | 
| functionArn |  呼び出す Lambda 関数の ARN。Lambda 関数は JSON データを返す必要があります。  | 
| inputJson |  Lambda 関数に渡される JSON 入力です｡ ネストされたオブジェクトクエリとリテラルを渡すには、SQL バージョン 2016-03-23 を使用する必要があります。  | 

指定された Lambda 関数を呼び出すアクセス許可を付与 AWS IoT `lambda:InvokeFunction`する必要があります。次の例は、`lambda:InvokeFunction` を使用して AWS CLI権限を付与する方法を示しています。

```
aws lambda add-permission --function-name "function_name"
--region "region"
--principal iot.amazonaws.com 
--source-arn arn:aws:iot:us-east-1:account_id:rule/rule_name
--source-account "account_id"
--statement-id "unique_id" 
--action "lambda:InvokeFunction"
```

以下は、**add-permission** コマンドの引数です。

--function-name   
Lambda 関数の名前。関数のリソースポリシーを更新するための新しいアクセス許可を追加します。

--region  
 AWS リージョン アカウントの 。

--principal  
アクセス権限を取得するプリンシパル。これは、Lambda 関数を呼び出す AWS IoT アクセス許可を付与`iot.amazonaws.com`するためです。

--source-arn  
ルールの ARN。**get-topic-rule** AWS CLI コマンドを使用して、ルールの ARN を取得できます。

--source-account  
 AWS アカウント ルールが定義されている 。

--statement-id  
一意のステートメント ID。

--action  
このステートメントで許可する Lambda アクション。 AWS IoT が Lambda 関数を呼び出すことを許可するには、`lambda:InvokeFunction` を指定します。

**重要**  
`source-arn` または を指定せずにプリン AWS IoT シパルのアクセス許可を追加すると`source-account`、Lambda アクションを使用してルールを作成する は AWS アカウント 、Lambda 関数を呼び出すルールをトリガーできます AWS IoT。詳細については、[[Lambda Permission Model](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html)](ラムダのアクセス許可モデル)を参照してください。

次のような JSON メッセージペイロードがあるとします。

```
{
    "attribute1": 21,
    "attribute2": "value"
}
```

`aws_lambda` 関数は、以下のように Lambda 関数を呼び出すために使用できます。

```
SELECT
aws_lambda("arn:aws:lambda:us-east-1:account_id:function:lambda_function", {"payload":attribute1}) as output FROM 'topic-filter'
```

完全な MQTT メッセージペイロードを渡したい場合は、次の例のように、「\$1」を使用して JSON ペイロードを指定できます。

```
SELECT
aws_lambda("arn:aws:lambda:us-east-1:account_id:function:lambda_function", *) as output FROM 'topic-filter'
```

`payload.inner.element` は、'topic/subtopic' トピックで発行されたメッセージからデータを選択します。

`some.value` は、Lambda 関数によって生成された出力からデータを選択します。

**注記**  
 ルールエンジンは、Lambda 関数の実行時間を制限します。ルールからの Lambda 関数の呼び出しは、2000 ミリ秒以内に完了する必要があります。

## bitand(Int、Int)
<a name="iot-func-bitand"></a>

2 つの `Int` (-converted) 引数のビット表現におけるビット単位の AND を実行します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `bitand(13, 5)` = 5


****  

| 引数の型 | 引数の型 | 結果 | 
| --- | --- | --- | 
| Int | Int | Int、2 つの引数のビット単位の AND。 | 
| Int/Decimal | Int/Decimal | Int、2 つの引数のビット単位の AND。すべての非 Int 数は、最も近い Int に切り下げられます。いずれかの引数が Int に変換できない場合、結果は Undefined です。 | 
| Int/Decimal/String | Int/Decimal/String | Int、2 つの引数のビット単位の AND。すべての文字列は小数に変換され、最も近い Int に切り下げられます。変換が失敗した場合、結果は Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## bitor(Int、Int)
<a name="iot-func-bitor"></a>

2 つの引数のビット表現のビット単位の OR を実行します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `bitor(8, 5)` = 13


****  

| 引数の型 | 引数の型 | 結果 | 
| --- | --- | --- | 
| Int | Int | Int、2 つの引数のビット単位の OR。 | 
| Int/Decimal | Int/Decimal | Int、2 つの引数のビット単位の OR。すべての非 Int 数は、最も近い Int に切り下げられます。変換が失敗した場合、結果は Undefined です。 | 
| Int/Decimal/String | Int/Decimal/String | Int、2 つの引数におけるビット単位の OR。すべての文字列は小数に変換され、最も近い Int に切り下げられます。変換が失敗した場合、結果は Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## bitxor(Int、Int)
<a name="iot-func-xbitor"></a>

2 つの `Int` (-converted) 引数のビット表現におけるビット単位の XOR を実行します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `bitor(13, 5)` = 8


****  

| 引数の型 | 引数の型 | 結果 | 
| --- | --- | --- | 
| Int | Int | Int、2 つの引数におけるビット単位の XOR。 | 
| Int/Decimal | Int/Decimal | Int、2 つの引数におけるビット単位の XOR。非 Int 数は、最も近い Int に切り下げられます。 | 
| Int/Decimal/String | Int/Decimal/String | Int、2 つの引数におけるビット単位の XOR。文字列は小数に変換され、最も近い Int に切り下げられます。いずれかの変換が失敗した場合、結果は Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## bitnot(Int)
<a name="iot-func-bitnot"></a>

`Int` (-converted) 引数のビット表現におけるビット単位の NOT を実行します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `bitnot(13)` = 2


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Int、引数のビット単位の NOT。 | 
| Decimal | Int、引数のビット単位の NOT。Decimal の値は、最も近い Int に切り下げられます。 | 
| String | Int、引数のビット単位の NOT。文字列は小数に変換され、最も近い Int に切り下げられます。いずれかの変換が失敗した場合、結果は Undefined です。 | 
| その他の値 | その他の値。 | 

## cast()
<a name="iot-sql-function-cast"></a>

値を 1 つのデータ型から別のデータ型へ変換します。cast は通常の変換と同様に動作し、数値をブールへ/からキャストする追加機能があります。が 1 つのタイプを別のタイプにキャストする方法を決定 AWS IoT できない場合、結果は です`Undefined`。SQL バージョン 2015-10-08 以降でサポートされています。形式: cast(*値* as *型*)。

例:

`cast(true as Int) ` = 1

`cast` を呼び出す際、次のキーワードが「as」の後に表示される場合があります。


**SQL バージョン 2015-10-08 および 2016-03-23 向け**  

| キーワード | 結果 | 
| --- | --- | 
| String | 値を String へキャストします。 | 
| Nvarchar | 値を String へキャストします。 | 
| Text | 値を String へキャストします。 | 
| Ntext | 値を String へキャストします。 | 
| varchar | 値を String へキャストします。 | 
| Int | 値を Int へキャストします。 | 
| 整数 | 値を Int へキャストします。 | 
| Double | 値を (倍精度で) Decimal にキャストします。 | 


**さらに、SQL バージョン 2016-03-23 向け**  

| キーワード | 結果 | 
| --- | --- | 
| Decimal | 値を Decimal へキャストします。 | 
| Bool | 値を Boolean へキャストします。 | 
| Boolean | 値を Boolean へキャストします。 | 

キャストのルール:


**Decimal へのキャスト**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 小数点のない Decimal。 | 
| Decimal |  ソース値。  SQL V2 (2016-03-23) では、`10.0` などの整数である数値は、想定される `Int` 値 (`10`) の代わりに `Decimal` 値 (`10.0`) を返します。整数の数値を `Decimal` 値として確実にキャストするには、ルールクエリステートメントに SQL V1 (2015-10-08) を使用します。   | 
| Boolean | true = 1.0, false = 0.0. | 
| String | 文字列を Decimal として解析しようとします。 AWS IoT は、正規表現 (^-?\$1d\$1(\$1.\$1d\$1)?((?i)E-?\$1d\$1)?\$1) と一致する文字列を解析するよう試みます。「0」、「-1.2」、「5E-12」は、小数に自動的に変換される文字列の例です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 


**Int へのキャスト**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | ソース値。 | 
| Decimal | 最も近い Int へ切り下げられたソース値。 | 
| Boolean | true = 1.0, false = 0.0. | 
| String | 文字列を Decimal として解析しようとします。 AWS IoT は、正規表現 (^-?\$1d\$1(\$1.\$1d\$1)?((?i)E-?\$1d\$1)?\$1) と一致する文字列を解析するよう試みます。「0」「-1.2」「5E-12」はすべて自動的に小数に変換される文字列の例です。 AWS IoT は文字列を Decimal に変換するよう試み、最も近い Int へ切り下げます。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 


**`Boolean` へのキャスト**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 0 = False, any\$1nonzero\$1value = True。 | 
| Decimal | 0 = False, any\$1nonzero\$1value = True。 | 
| Boolean | ソース値。 | 
| String | "true" = True および "false" = False (大文字小文字の区別なし)。その他の文字列値 = Undefined。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 


**String へのキャスト**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Int の文字列表現、標準表記。 | 
| Decimal | おそらく科学的表記での Decimal 値の文字列表現。 | 
| Boolean | 「true」または「false」、すべて小文字。 | 
| String | ソース値。 | 
| 配列 | JSON へシリアル化された配列。結果の文字列は角括弧で囲まれたカンマ区切りのリストです。String は引用符で囲まれます。Decimal、Int、Boolean は囲まれません。 | 
| オブジェクト | JSON にシリアル化されたオブジェクト。JSON 文字列はキーと値のペアのカンマ区切りのリストで、最初と最後に中括弧があります。String は引用符で囲まれます。Decimal、Int、Boolean、Null は囲まれません。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## ceil(10 進数)
<a name="iot-func-ceil"></a>

指定の `Decimal` を最も近い `Int` に切り上げます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`ceil(1.2)` = 2

`ceil(-1.2)` = -1


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Int、引数値。 | 
| Decimal | Int、最も近い Decimal へ切り上げられたInt 値。 | 
| String | Int。文字列は Decimal に変換され、最も近い Int へ切り上げられます。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| その他の値 | Undefined. | 

## chr(文字列)
<a name="iot-func-chr"></a>

指定の `Int` 引数に対応する ASCII 文字を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例: 

`chr(65)` = "A"。

`chr(49)` = "1"。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 指定された ASCII 値に対応する文字。引数が有効な ASCII 値でない場合、結果は Undefined です。 | 
| Decimal | 指定された ASCII 値に対応する文字。Decimal 引数は、最も近い Int に切り下げられます。引数が有効な ASCII 値でない場合、結果は Undefined です。 | 
| Boolean | Undefined. | 
| String | String が Decimal に変換できる場合、最も近い Int に切り下げられます。引数が有効な ASCII 値でない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| その他の値 | Undefined. | 

## clientid()
<a name="iot-sql-function-clientid"></a>

メッセージを送信している MQTT クライアントの ID を返すか、または、メッセージが MQTT クライアント経由で送られていない場合は、`n/a` を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`clientid() ` = "123456789012"

## concat()
<a name="iot-func-concat"></a>

配列または文字列を連結します。この関数は、任意の数の引数を受け取り、`String` または `Array` を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例: 

`concat() ` = `Undefined`.

`concat(1) ` = "1"。

`concat([1, 2, 3], 4)` = [1, 2, 3, 4]。

`concat([1, 2, 3], "hello")` = [1, 2, 3, "hello"]

`concat("con", "cat")` = "concat"

`concat(1, "hello")` = "1hello"

`concat("he","is","man")` = "heisman"

`concat([1, 2, 3], "hello", [4, 5, 6])` = [1, 2, 3, "hello", 4, 5, 6]


****  

| 引数の数 | 結果 | 
| --- | --- | 
| 0 | Undefined. | 
| 1 | 引数は変更されずに返されます。 | 
| 2\$1 |  引数が `Array` の場合、結果はすべての引数を含む 1 つの配列です。どの引数も配列ではなく、少なくとも 1 つの引数が `String` の場合、結果はすべての引数の `String` 表現の連結です。引数は、前にリストされた標準変換を使用して、文字列に変換されます。  | 

## cos(10 進数)
<a name="iot-func-cos"></a>

数値のコサインをラジアンで返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: 

`cos(0)` = 1.


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数のコサイン。仮想上の結果は、Undefined として返されます。 | 
| Decimal | Decimal 「倍精度で」、引数のコサイン。仮想上の結果は、Undefined として返されます。 | 
| Boolean | Undefined. | 
| String | Decimal 「倍精度で」、引数のコサイン。文字列が Decimal に変換できない場合、結果は Undefined です。仮想上の結果は、Undefined として返されます。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## cosh(10 進数)
<a name="iot-func-cosh"></a>

数値のハイパーボリックコサインをラジアンで返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `cosh(2.3)` = 5.037220649268761。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数の双曲線コサイン。仮想上の結果は、Undefined として返されます。 | 
| Decimal | Decimal 「倍精度で」、引数の双曲線コサイン。仮想上の結果は、Undefined として返されます。 | 
| Boolean | Undefined. | 
| String | Decimal 「倍精度で」、引数の双曲線コサイン。文字列が Decimal に変換できない場合、結果は Undefined です。仮想上の結果は、Undefined として返されます。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## decode(value, decodingScheme)
<a name="iot-sql-decode-base64"></a>

`decode` 関数を使用して、エンコードされた値をデコードします。デコードされた文字列が JSON ドキュメントの場合、アドレス指定可能なオブジェクトが返されます。それ以外の場合、デコードされた文字列は文字列として返されます。文字列がデコードできない場合、この関数は NULL を返します。この関数は、base64 でエンコードされた文字列とプロトコルバッファ (protobuf) メッセージ形式のデコードをサポートします。

SQL バージョン 2016-03-23 以降でサポートされています。

値  
文字列を返す文字列値、または [AWS IoT SQL リファレンス](iot-sql-reference.md) で定義されている有効な式のいずれか。

decodingScheme  
値をデコードするために使用されるスキームを表すリテラル文字列。現在 `'base64'` そして `'proto'` のみがサポートされています。

### base64 でエンコードされた文字列のデコード
<a name="iot-sql-decode-example"></a>

この例では、メッセージペイロードにエンコードされた値が含まれています。

```
{
    encoded_temp: "eyAidGVtcGVyYXR1cmUiOiAzMyB9Cg=="
}
```

この SQL ステートメントの `decode` 関数は、メッセージペイロードの値をデコードします。

```
SELECT decode(encoded_temp,"base64").temperature AS temp from 'topic/subtopic'
```

`encoded_temp` 値をデコードすると、次の有効な JSON ドキュメントが生成され、SELECT ステートメントで温度値を読み取ることができます。

```
{ "temperature": 33 }
```

この例では、SELECT ステートメントの結果は以下のとおりです。

```
{ "temp": 33 }
```

デコードされた値が有効な JSON ドキュメントでない場合、デコードされた値は文字列として返されます。

### protobuf メッセージペイロードのデコード
<a name="iot-sql-decode-protobuf"></a>

decode SQL 関数を使用して、protobuf メッセージペイロードをデコードできるルールを設定できます。詳細については、「[protobuf メッセージペイロードのデコード](binary-payloads.md#binary-payloads-protobuf)」を参照してください。

**重要**  
プリン AWS IoT シパルのアクセス許可を設定する`source‐account`ときに `source‐arn`または を省略すると、 は他の AWS IoT ルールを通じてデコード関数を呼び出す AWS アカウント ことができます。関数を保護するには、「*Amazon Simple Storage Service ユーザーガイド*」の「[バケットポリシー](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-policies.html)」を参照してください。

この関数の署名は次のようになります。

```
decode(<ENCODED DATA>, 'proto', '<S3 BUCKET NAME>', '<S3 OBJECT KEY>', '<PROTO NAME>', '<MESSAGE TYPE>')            
```

`ENCODED DATA`  
デコードする protobuf でエンコードされたデータを指定します。ルールに送信されるメッセージ全体が protobuf でエンコードされたデータである場合は、`*` を使用して raw バイナリ受信ペイロードを参照できます。それ以外の場合は、このフィールドは base-64 でエンコードされた JSON 文字列である必要があり、文字列への参照を直接渡すことができます。  
1) raw バイナリ protobuf 受信ペイロードをデコードするには次のように入力します。  

```
decode(*, 'proto', ...)
```
2) base64 でエンコードされた文字列「a.b」で表される protobuf エンコードされたメッセージをデコードするには、次のように入力します。  

```
decode(a.b, 'proto', ...)
```

`proto`  
protobuf メッセージ形式でデコードするデータを指定します。`proto` の代わりに `base64` を指定すると、この関数は base64 でエンコードされた文字列を JSON としてデコードします。

`S3 BUCKET NAME`  
`FileDescriptorSet` ファイルをアップロードした Amazon S3 バケットの名前。

`S3 OBJECT KEY`  
Amazon S3 バケット内の `FileDescriptorSet` ファイルを指定するオブジェクトキー。

`PROTO NAME`  
`FileDescriptorSet` ファイルを生成した `.proto` ファイルの名前 (拡張子を除く)。

`MESSAGE TYPE`  
`FileDescriptorSet` ファイル内の protobuf メッセージ構造の名前。デコードするデータはこの構造に従う必要があります。

decode SQL 関数を使用した SQL 式の例は次のようになります。

```
SELECT VALUE decode(*, 'proto', 's3-bucket', 'messageformat.desc', 'myproto', 'messagetype') FROM 'some/topic'
```
+ `*`

  `mymessagetype` と呼ばれる protobuf メッセージタイプに準拠するバイナリの受信ペイロードを表します。
+ `messageformat.desc`

  `s3-bucket` という名前の Amazon S3 バケットに保存されている `FileDescriptorSet` ファイル。
+ `myproto`

  `myproto.proto` という名前の `FileDescriptorSet` ファイルを生成するために使用されたオリジナルの `.proto` ファイル。
+ `messagetype`

  `myproto.proto` で定義された `messagetype` と呼ばれるメッセージタイプ (インポートされた依存関係を含む)。

## encode(value, encodingScheme)
<a name="iot-sql-encode-payload"></a>

エンコードスキームに基づいて、ペイロード (非 JSON データの場合もある) を文字列表現にエンコードするには、`encode` 関数を使用します。SQL バージョン 2016-03-23 以降でサポートされています。

値  
[AWS IoT SQL リファレンス](iot-sql-reference.md) で定義されている任意の有効な式。JSON 形式かどうかに関係なくペイロード全体をエンコードするには、\$1 を指定できます。式を指定した場合は、まず評価の結果が文字列に変換され、その後でエンコードされます。

encodingScheme  
使用するエンコードスキームを表すリテラル文字列。現在は、`'base64'` のみがサポートされます。

## endswith(文字列、文字列)
<a name="iot-func-endswith"></a>

`Boolean` を返し、最初の `String` 引数が 2 番目の `String` 引数で終わるかどうかを示します。どちらかの引数が `Null` または `Undefined` の場合、結果は `Undefined` です。SQL バージョン 2015-10-08 以降でサポートされています。

例: `endswith("cat","at")` = true。


****  

| 引数の型 1 | 引数の型 2 | 結果 | 
| --- | --- | --- | 
| String | String | 最初の引数が 2 番目の引数で終わる場合は true。それ以外の場合は、false を返します。 | 
| その他の値 | その他の値 | 両方の引数は標準変換ルールを使用して文字列に変換されます。最初の引数が 2 番目の引数で終わる場合は true。それ以外の場合は、false を返します。どちらかの引数が Null または Undefined の場合、結果は Undefined です。 | 

## exp(10 進数)
<a name="iot-func-exp"></a>

e を `Decimal` 引数の累乗にして返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `exp(1)` = e。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal(倍精度で)、e ^ 引数。 | 
| Decimal | Decimal(倍精度で)、e ^ 引数。 | 
| String | Decimal(倍精度で)、e ^ 引数。String が Decimal に変換できない場合、結果は Undefined です。 | 
| その他の値 | Undefined. | 

## floor(Decimal)
<a name="iot-func-floor"></a>

指定の `Decimal` を最も近い `Int` に切り下げます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`floor(1.2)` = 1

`floor(-1.2)` = -2


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Int、引数値。 | 
| Decimal | Int、最も近い Decimal へ切り下げられた Int 値。 | 
| String | Int。文字列は Decimal に変換され、最も近い Int へ切り下げられます。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| その他の値 | Undefined. | 

## get
<a name="iot-sql-function-get"></a>

コレクションのような型から値を抽出します (配列、文字列、オブジェクト)。最初の引数に変換は適用されません。テーブルで説明されているように、変換は 2 番目の引数に適用されます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`get(["a", "b", "c"], 1) ` = "b"

`get({"a":"b"}, "a")` = "b"

`get("abc", 0)` = "a"


****  

| 引数の型 1 | 引数の型 2 | 結果 | 
| --- | --- | --- | 
| 配列 | Any Type (Int に変換) | 2 番目の引数により提供される Array のゼロベースインデックスの項目 (Int に変換)。変換が失敗した場合、結果は Undefined です。インデックスが Array の境界の外にある場合 (negative or >= array.length)、結果は Undefined です。 | 
| 文字列 | Any Type (Int に変換) | 2 番目の引数により提供される文字列のゼロベースインデックスの文字 (Int に変換)。変換が失敗した場合、結果は Undefined です。インデックスが文字列の境界の外にある場合 (negative or >= string.length)、結果は Undefined です。 | 
| オブジェクト | String (変換の適用なし) | 2 番目の引数として提供される文字列キーに対応する最初の引数のオブジェクトに保存されている値。 | 
| その他の値 | 任意の値 | Undefined. | 

## get\$1dynamodb (tableName、partitionKeyName、partitionKeyValue、sortKeyName、sortKeyValue, roleArn)
<a name="iot-sql-function-get-dynamodb"></a>

DynamoDB テーブルからデータを取得します。`get_dynamodb()` を使用すると、ルールが評価されている間に DynamoDB テーブルを照会できます。DynamoDB から取得したデータを使用して、メッセージペイロードをフィルタリングまたは拡張できます。SQL バージョン 2016-03-23 以降でサポートされています。

`get_dynamodb()` には以下のパラメータがあります。

tableName  
クエリする DynamoDB テーブルの名前。

partitionKeyName  
パーティションキーの名前。詳細については、「[DynamoDB Keys](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)」を参照してください。

partitionKeyValue  
レコードを識別するために使用されるパーティションキーの値。詳細については、「[DynamoDB Keys](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)」を参照してください。

sortKeyName  
(オプション) ソートキーの名前。このパラメータは、クエリされた DynamoDB テーブルが複合キーを使用する場合にのみ必要です。詳細については、「[DynamoDB Keys](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)」を参照してください。

sortKeyValue  
(オプション) ソートキーの値。このパラメータは、クエリされた DynamoDB テーブルが複合キーを使用する場合にのみ必要です。詳細については、「[DynamoDB Keys](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey)」を参照してください。

roleArn  
DynamoDB テーブルへのアクセスを付与する IAM ロールの ARN。ルールエンジンは、ユーザーに代わって DynamoDB テーブルにアクセスするためにこのロールを引き受けます。過度に許容されるロールの使用は避けてください。ルールで必要なアクセス許可のみをロールに付与します。1 つの DynamoDB テーブルへのアクセスを許可するポリシーの例を次に示します。    
****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "dynamodb:GetItem",
            "Resource": "arn:aws:dynamodb:us-east-1:123456789012:table/table-name"
        }
    ]
}
```

`get_dynamodb()` の使用方法の例として、 AWS IoTに接続されているすべてのデバイスのデバイス ID と位置情報を含む DynamoDB テーブルがあるとします。次の SELECT 文は、 `get_dynamodb()` 関数を使用して、指定したデバイス ID の場所を取得します。

`SELECT *, get_dynamodb("InServiceDevices", "deviceId", id, "arn:aws:iam::12345678910:role/getdynamo").location AS location FROM 'some/topic' `

**注記**  
1 つの SQL 文につき最大 1 回 `get_dynamodb()` を呼び出すことができます。1 つの SQL 文で `get_dynamodb()` 複数回呼び出すと、アクションを呼び出さずにルールが終了します。

## get\$1mqtt\$1property(name)
<a name="iot-sql-function-get-mqtt-property"></a>

次の MQTT5 ヘッダーのいずれかを参照します: `contentType`、`payLoadFormatIndicator`、`responseTopic`、`correlationData`。この関数は、`content_type`、`format_indicator`、`response_topic`、`correlation_data` いうリテラル文字列のいずれかを引数としてとります。詳細については、以下の**関数の引数**表を参照してください。

contentType  
文字列: 公開メッセージの内容を説明する UTF-8 でエンコードされた文字列。

payLoadFormatIndicator  
文字列: ペイロードが UTF-8 としてフォーマットされているかどうかを示す列挙型文字列の値。有効な値は、`UNSPECIFIED_BYTES` および `UTF8_DATA` です。

responseTopic  
文字列: 応答メッセージのトピック名として使用される UTF-8 でエンコードされた文字列。レスポンストピックは、受信者がリクエスト/レスポンスフローの一部として公開すべきトピックを説明するために使用されます。トピックにワイルドカード文字を含めることはできません。

correlationData  
文字列: 要求メッセージの送信者によって base64 でエンコードされたバイナリデータで、応答メッセージを受信した際に、それがどの要求に対するものかを識別するために使用されます。

次の表は、`get_mqtt_property` 関数で使用できる関数の引数と、それに関連する戻り値の型を示しています。


**関数の引数**  

| SQL | 返されるデータ型 (存在する場合) | 返されるデータ型 (存在しない場合) | 
| --- | --- | --- | 
| get\$1mqtt\$1property("format\$1indicator") | 文字列 (UNSPECIFIED\$1BYTES または UTF8\$1DATA) | 文字列 (UNSPECIFIED\$1BYTES) | 
| get\$1mqtt\$1property("content\$1type") | String | 未定義 | 
| get\$1mqtt\$1property("response\$1topic") | String | 未定義 | 
| get\$1mqtt\$1property("correlation\$1data") | base64 でエンコードされた文字列 | 未定義 | 
| get\$1mqtt\$1property("some\$1invalid\$1name") | 未定義 | 未定義 | 

以下の SQL ルール例では、`contentType`、`payLoadFormatIndicator`、`responseTopic`、`correlationData` のいずれかの MQTT5 ヘッダーを参照しています。

```
SELECT *, get_mqtt_property('content_type') as contentType,
          get_mqtt_property('format_indicator') as payloadFormatIndicator,
          get_mqtt_property('response_topic') as responseTopic,
          get_mqtt_property('correlation_data') as correlationData
FROM 'some/topic'
```

## get\$1or\$1default(式、defaultValue)
<a name="iot-sql-function-get-or-default"></a>

指定された場合は 2 番目のパラメータのデフォルト値を返します。それ以外の場合は、最初のパラメータの式が null、undefined、または fail を返すときに undefined を返します。SQL バージョン 2016-03-23 以降でサポートされています。

**重要**  
`get_or_default` は、JSON 以外のペイロードをそのまま直接サポートしていません。JSON 以外のペイロードを使用している場合は、 `encode`または `decode`関数を使用します。

`get_or_default()` には以下のパラメータがあります。

expression  
[データ型](iot-sql-data-types.md)、[関数](#iot-sql-functions)、、[変数](iot-sql-set.md#iot-sql-set-usage)[リテラル](iot-sql-literals.md)、、[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)または を含む有効な式[JSON 拡張](iot-sql-json.md)。

defaultValue  
(オプション) [データ型](iot-sql-data-types.md)、[関数](#iot-sql-functions)、、[変数](iot-sql-set.md#iot-sql-set-usage)[リテラル](iot-sql-literals.md)、、[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)または を含む有効な式[JSON 拡張](iot-sql-json.md)。これは、最初の引数が null、未定義、または失敗を返すたびに返される値です。  
get\$1secret、get\$1dynamodb、aws\$1lambda、get\$1thing\$1shadow、decode-protobuf、Machinelearning\$1predict など、顧客所有のリソースからデータを取得する関数は、defaultValue パラメータでは許可されません。

次の表は、各引数と関連する出力に許容される関数引数を示しています。


| 最初の引数 | 2 番目の引数 | Output | 
| --- | --- | --- | 
| 成功した評価 | 任意の値または指定なし | 最初の引数値。 | 
| 未定義、Null、または失敗 | Undefined または Null を含む任意の値 | 2 番目の引数値。 | 
| 未定義、Null、または失敗 | 指定されていません | Undefined | 

**例:**

例 1:

次の例では、DynamoDB テーブルまたはクエリが失敗した場合の defaultValue 値を示します。

```
SELECT 
    device_id,
    get_or_default(
        get_dynamodb("DeviceConfig", "deviceId", nonExistentId, "arn:aws:iam::123456789012:role/ROLE_NAME"),
        {"mode": "standard", "timeout": 30, "enabled": true }
    ) as config
FROM 'device/telemetry'
```

例 2:

次の例では、ステータスが未定義の場合、安全なデフォルト値「UNKNOWN」を示します。

```
SELECT 
  get_or_default( CASE status
    WHEN 'active' THEN 'GOOD'
    WHEN 'inactive' THEN 'BAD'/
    ELSE 'UNKNOWN'
  END, 'UNKNOWN') as status_category
FROM 'topic/subtopic'
```

例 3:

次の例は、単一のパラメータで get\$1or\$1default を使用する方法を示しています。これは、明確なデフォルト値がないが、ルールの実行を失敗させたくない場合に役立ちます。

```
SELECT 
  get_dynamodb("DeviceConfig", "deviceId", nonExistentId, "arn:aws:iam::123456789012:role/ROLE_NAME") as config
FROM 'device/telemetry'
```

DynamoDB ルックアップが失敗した場合、ルールの実行は失敗し、アクションは実行されません。代わりに次の SQL を使用する場合:

```
SELECT 
  get_or_default(get_dynamodb("DeviceConfig", "deviceId", nonExistentId, "arn:aws:iam::123456789012:role/ROLE_NAME")) as config
FROM 'device/telemetry'
```

get\$1or\$1default ステートメントは に評価されるため`Undefined`、この例では SELECT ステートメント全体が に評価`{}`され、すべてのルールアクションが試行されます。

**重要**  
この機能を使用する際にセキュリティを維持するために、以下のベストプラクティスに従うことをお勧めします。  
デフォルト値を含むルール定義でハードコードされたシークレットを使用しない
機密情報の管理 AWS Secrets Manager に使用する

## get\$1registry\$1data(registryAPI, thingName, roleArn)
<a name="iot-sql-function-get-registry-data"></a>

 AWS IoT ルール内の AWS IoT モノのレジストリデータを取得します。レジストリデータ (デバイスが属する属性、モノのタイプ、モノのグループなど) を読み取って、この情報を使用してメッセージをフィルタリング、強化、または動的にルーティングできます。SQL バージョン 2016-03-23 以降でサポートされています。

`get_registry_data()` には以下のパラメータがあります。

registryAPI  
呼び出されるレジストリ API。有効な値は、`DescribeThing` および `ListThingGroupsForThing` です。これらの値は定数文字列である必要があります。

thingName  
文字列: レジストリデータを取得するモノの名前。

roleArn  
文字列: 呼び出される API に基づく`iot:DescribeThing`アクセス許可またはアクセス`iot:ListThingGroupsForThing`許可を持つロール ARN。

`get_registry_data` 関数のレスポンス形式は、 というレジストリ API と同じです。詳細については、[DescribeThing](https://docs.aws.amazon.com//iot/latest/apireference/API_DescribeThing.html) API と [ListThingGroupsForThing](https://docs.aws.amazon.com//iot/latest/apireference/API_ListThingGroupsForThing.html) APIsを参照してください。

例:

モノのタイプ情報を取得して、モノのタイプが であるモノ (モノの名前が MQTT クライアント ID と一致するもの) の AWS IoT Core ライフサイクルイベントメッセージをフィルタリングできます`testenv`。

```
SELECT * 
FROM '$aws/events/lifecycle/+' 
WHERE 
    get_registry_data("DescribeThing",clientId,[roleArn]).thingTypeName='testenv'
```

例:

ゲートウェイデバイス によって送信される`sensor1`すべてのメッセージのモノの名前を持つデバイスのモノ属性を取得できます`gateway1`。

```
SELECT *, get_registry_data("DescribeThing","sensor1",[roleArn]).attributes.temperature_threhold AS device1_tempthreshold 
FROM home1/gateway1/sensor1/#
```

**注記**  
アクションとエラーアクションの SQL ステートメントと置換テンプレートごとに`get_registry_data()`最大 1 回呼び出すことができます。

## get\$1secret(secretId, secretType, key, roleArn)
<a name="iot-sql-function-get-secret"></a>

[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/) の現在のバージョンのシークレットの暗号化された `SecretString` または `SecretBinary` フィールドの値を取得します。シークレットの作成と維持の詳細については、[CreateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_CreateSecret.html)、[UpdateSecret](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_UpdateSecret.html)、および [PutSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_PutSecretValue.html) を参照してください。

`get_secret()` には以下のパラメータがあります。

secretId  
文字列: 取得するシークレットの Amazon リソースネーム (ARN) またはフレンドリ名。

secretType  
文字列: シークレットタイプ。有効な値: `SecretString` \$1 `SecretBinary`。    
SecretString  
+ APIs、、 AWS CLIまたは AWS Secrets Manager コンソールを使用して JSON オブジェクトとして作成するシークレットの場合:
  + `key` パラメータの値を指定すると、この関数は指定されたキーの値を返します。
  + `key` パラメータの値を指定しない場合、この関数は JSON オブジェクト全体を返します。
+ API または AWS CLIを使用して非 JSON オブジェクトとして作成するシークレットについては、以下を実行します。
  + `key` パラメータの値を指定すると、この関数は例外で失敗します。
  + `key` パラメータの値を指定しない場合、この関数はシークレットの内容を返します。  
SecretBinary  
+ `key` パラメータの値を指定すると、この関数は例外で失敗します。
+ `key` パラメータの値を指定しない場合、この関数は base64 でエンコードされた UTF-8 文字列としてシークレット値を返します。

key  
(オプション) 文字列: シークレットの `SecretString` フィールドに保存されている JSON オブジェクト内のキー名。JSON オブジェクト全体ではなく、シークレットに保存されているキーの値のみを取得する場合は、この値を使用します。  
このパラメータの値を指定し、シークレットの `SecretString` フィールド内に JSON オブジェクトが含まれていない場合、この関数は例外で失敗します。

roleArn  
文字列: `secretsmanager:GetSecretValue` および `secretsmanager:DescribeSecret` アクセス許可を持つロール ARN。

**注記**  
この関数は常に、シークレットの現在のバージョン (`AWSCURRENT` タグ付きのバージョン) を返します。 AWS IoT ルールエンジンは、各シークレットを最大 15 分間キャッシュします。その結果、ルールエンジンがシークレットを更新するのに最長で 15 分かかることがあります。つまり、 での更新から最大 15 分後にシークレットを取得した場合 AWS Secrets Manager、この関数は以前のバージョンを返す可能性があります。  
この関数は計測されませんが、 AWS Secrets Manager 料金が適用されます。シークレットキャッシュメカニズムにより、ルールエンジンが AWS Secrets Managerを呼び出すことがあります。ルールエンジンは完全に分散されたサービスであるため、15 分のキャッシュウィンドウ中にルールエンジンから複数の Secrets Manager API 呼び出しが実行される場合があります。

例:

次の API キー認証の例のように、HTTPS ルールアクションの認証ヘッダーで `get_secret` 関数を使用できます。

```
"API_KEY": "${get_secret('API_KEY', 'SecretString', 'API_KEY_VALUE', 'arn:aws:iam::12345678910:role/getsecret')}"
```

HTTPS ルールアクションの詳細については、「[HTTP](https-rule-action.md)」を参照してください。

## get\$1thing\$1shadow(thingName、shadowName、roleArn)
<a name="iot-sql-function-get-thing-shadow"></a>

指定されたモノの指定されたシャドウを返します。SQL バージョン 2016-03-23 以降でサポートされています。

thingName  
文字列: シャドウを取得する対象のモノの名前。

shadowName  
(オプション) 文字列: シャドウの名前。このパラメータは、名前の付きのシャドウを参照する場合にのみ必要です。

roleArn  
文字列: `iot:GetThingShadow` アクセス権限を持つロール ARN。

例:

名前付きシャドウとともに使用する場合は、`shadowName` パラメータを指定します。

```
SELECT * from 'topic/subtopic'
WHERE
    get_thing_shadow("MyThing","MyThingShadow","arn:aws:iam::123456789012:role/AllowsThingShadowAccess")
    .state.reported.alarm = 'ON'
```

名前のないシャドウとともに使用する場合は、`shadowName` パラメータを省略します。

```
SELECT * from 'topic/subtopic'
WHERE
    get_thing_shadow("MyThing","arn:aws:iam::123456789012:role/AllowsThingShadowAccess")
    .state.reported.alarm = 'ON'
```

## get\$1user\$1properties(userPropertyKey)
<a name="iot-sql-function-get-user-properties"></a>

MQTT5 でサポートされているプロパティヘッダーの一種であるユーザープロパティを参照します。

userProperty  
文字列: ユーザープロパティは、キーと値のペアです。この関数は、キーを引数にとり、関連するキーと一致するすべての値の配列を返します。

**関数の引数**

メッセージヘッダー内の以下のユーザープロパティの場合:


| キー | 値 | 
| --- | --- | 
| あるキー | ある値 | 
| 別のキー | 別の値 | 
| あるキー | 重複したキーを持つ値 | 

次の表に、予想される SQL の動作を示します。


| SQL | 返されるデータ型 | 返されるデータ値 | 
| --- | --- | --- | 
| get\$1user\$1properties('あるキー') | 文字列の配列 | ['some value', 'value with duplicate key'] | 
| get\$1user\$1properties('別のキー') | 文字列の配列 | ['a different value'] | 
| get\$1user\$1properties( ) | キーと値のペアのオブジェクトの配列 | [\$1'"some key": "some value"'\$1, \$1"other key": "a different value"\$1, \$1"some key": "value with duplicate key"\$1] | 
| get\$1user\$1properties('存在しないキー') | 未定義 |  | 

以下の SQL ルール例では、ユーザープロパティ (MQTT5 プロパティヘッダーの一種) をペイロードに参照しています。

```
SELECT *, get_user_properties('user defined property key') as userProperty
FROM 'some/topic'
```

## ハッシュ関数
<a name="iot-sql-function-hash"></a>

 AWS IoT には、次のハッシュ関数が用意されています。
+ md2
+ md5
+ sha1
+ sha224
+ sha256
+ sha384
+ sha512

1 つの文字列引数を除くすべてのハッシュ関数。結果はその文字列のハッシュ値です。標準文字列変換は非文字列引数に適用されます。すべてのハッシュ関数は、SQL バージョン 2015-10-08 以降でサポートされます。

例:

`md2("hello")` = "a9046c73e00331af68917d3804f70655"

`md5("hello")` = "5d41402abc4b2a76b9719d911017c592"

## indexof(文字列、文字列)
<a name="iot-sql-function-indexof"></a>

最初の引数のサブ文字列として、2 番目の引数の最初のインデックス (ゼロベース) を返します。両方の引数は文字列であることが期待されます。文字列ではない引数は、標準文字列変換ルールに従います。この関数は、配列にではなく、文字列にのみ適用されます。SQL バージョン 2016-03-23 以降でサポートされています。

例:

`indexof("abcd", "bc") ` = 1

## isNull()
<a name="iot-sql-function-isNull"></a>

引数が `Null` 値である場合は true を返します。SQL バージョン 2016-03-23 以降でサポートされています。

例:

`isNull(5) ` = false。

`isNull(Null) ` = true。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | false | 
| Decimal | false | 
| Boolean | false | 
| String | false | 
| Array | false | 
| Object | false | 
| Null | true | 
| Undefined | false | 

## isUndefined()
<a name="iot-sql-function-isUndefined"></a>

引数が `Undefined` である場合は true を返します。SQL バージョン 2016-03-23 以降でサポートされています。

例:

`isUndefined(5) ` = false。

`isUndefined(floor([1,2,3]))) ` = true。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | false | 
| Decimal | false | 
| Boolean | false | 
| String | false | 
| Array | false | 
| Object | false | 
| Null | false | 
| Undefined | true | 

## length(文字列)
<a name="iot-sql-function-length"></a>

指定された文字列の文字数を返します。標準変換ルールは、非 `String` 引数に適用されます。SQL バージョン 2016-03-23 以降でサポートされています。

例:

`length("hi")` = 2

`length(false)` = 5

## ln(10 進数)
<a name="iot-func-nln"></a>

引数の自然対数を返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `ln(e)` = 1。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal (倍精度で)、引数の自然対数。 | 
| Decimal | Decimal (倍精度で)、引数の自然対数。 | 
| Boolean | Undefined. | 
| String | Decimal (倍精度で)、引数の自然対数。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## log(10 進数)
<a name="iot-func-log"></a>

引数の 10 を底とする対数を返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `log(100)` = 2.0。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数の 10 を底とした対数。 | 
| Decimal | Decimal 「倍精度で」、引数の 10 を底とした対数。 | 
| Boolean | Undefined. | 
| String | Decimal 「倍精度で」、引数の 10 を底とした対数。String が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## lower(文字列)
<a name="iot-func-lower"></a>

指定した `String` の小文字バージョンを返します。非文字列引数は標準変換ルールを使用して文字列に変換されます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`lower("HELLO")` = "hello"。

`lower(["HELLO"])` = "[\$1"hello\$1"]"。

## lpad(文字列、Int)
<a name="iot-func-lpad"></a>

2 番目の引数で指定された数のスペースを左詰めにした `String` 引数を返します。`Int` 引数は、0 ～ 1000 の間である必要があります。提供された値がこの有効な範囲の外にある場合は、引数は最も近い有効な値に設定されます (0 または 1000)。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`lpad("hello", 2)` = "`  hello`".

`lpad(1, 3)` = "`   1`"


****  

| 引数の型 1 | 引数の型 2 | 結果 | 
| --- | --- | --- | 
| String | Int | String、提供された String と同じ数のスペースを左詰めにして提供された Int。 | 
| String | Decimal | Decimal 引数は最も近い Int に切り下げられ、String には指定された数のスペースを左詰めにします。 | 
| String | String | 2 番目の引数は Decimal に変換され、最も近い Int に切り下げられます。また、String には指定された数のスペースが左詰めにされます。2 番目の引数が Int に変換できない場合、結果は Undefined です。 | 
| その他の値 | Int/Decimal/String | 最初の値は、標準変換ルールを使用して String に変換された後、LPAD 関数がその String に適用されます。それが変換できない場合、結果は Undefined です。 | 
| 任意の値 | その他の値 | Undefined. | 

## ltrim(文字列)
<a name="iot-func-ltrim"></a>

提供される `String` から先頭の空白 (タブとスペース) をすべて削除します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`Ltrim(" h i ")` = "hi "。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 先頭の空白がすべて削除された String の Int 表現。 | 
| Decimal | 先頭の空白がすべて削除された String の Decimal 表現。 | 
| Boolean | 先頭の空白がすべて削除されたブール (「true」または「false」) の String 表現。 | 
| String | 先頭の空白がすべて削除された引数。 | 
| 配列 | 先頭の空白がすべて削除された String の Array 表現 (標準変換ルールを使用)。 | 
| オブジェクト | 先頭の空白がすべて削除されたオブジェクトの String 表現 (標準変換ルールを使用)。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## machinelearning\$1predict (modelId, roleArn, record)
<a name="iot-sql-function-machine-learning"></a>

Amazon SageMaker AI モデルに基づいて、MQTT メッセージからのデータを使用して予測を行うには、`machinelearning_predict` 関数を使用します。SQL バージョン 2015-10-08 以降でサポートされています。`machinelearning_predict` 関数の引数は次のとおりです。

modelId  
予測を実行する対象となるモデルの ID。このモデルのリアルタイムエンドポイントを有効にしておく必要があります。

roleArn  
`machinelearning:Predict` アクセス許可および `machinelearning:GetMLModel` アクセス許可を許可するポリシーが指定され、予測を実行する対象となるモデルへのアクセスを許可する IAM ロール。

record  
SageMaker AI Predict API に渡されるデータ。単一レイヤーの JSON オブジェクトとして表す必要があります。record が複数レベルの JSON オブジェクトの場合は、値のシリアル化によって平坦化されます。たとえば、次の JSON の場合:  

```
{ "key1": {"innerKey1": "value1"}, "key2": 0}
```
 次のようになります。  

```
{ "key1": "{\"innerKey1\": \"value1\"}", "key2": 0}
```

この関数では、次のフィールドを持つ JSON オブジェクトが返されます。

predictedLabel  
モデルに基づく入力の区分。

details  
次の属性が含まれています。    
PredictiveModelType  
モデルのタイプ。有効な値は、REGRESSION、BINARY、MULTICLASS です。  
Algorithm  
予測を行うために SageMaker AI で使用されるアルゴリズム。この値は SGD にする必要があります。

predictedScores  
各ラベルに対応する、未加工の分類スコアを格納します。

predictedValue  
SageMaker AI によって予測された値。

## mod(10 進数、10 進数)
<a name="iot-func-mod"></a>

最初の引数を 2 番目の引数で割ったときの剰余を返します。[remainder(Decimal, Decimal)](#iot-func-remainder) と同等です。同じモジュロ機能に挿入演算子として「%」も使用できます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `mod(8, 3)` = 2。


****  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | Int、最初の引数を 2 番目の引数で割ったときの剰余。 | 
| Int/Decimal | Int/Decimal | Decimal、最初の引数を 2 番目のオペランドで割ったときの剰余。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列を小数に変換した場合、結果は、最初の引数を 2 番目の引数で割ったときの剰余です。そうでない場合は、Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## nanvl(AnyValue, AnyValue)
<a name="iot-func-nanvl"></a>

最初の引数が有効な `Decimal` ならば、最初の引数が返されます。それ以外の場合、2 番目の引数が返されます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `Nanvl(8, 3)` = 8。


****  

| 引数の型 1 | 引数の型 2 | 出力 | 
| --- | --- | --- | 
| 未定義 | 任意の値 | 2 番目の引数。 | 
| Null | 任意の値 | 2 番目の引数。 | 
| Decimal (NaN) | 任意の値 | 2 番目の引数。 | 
| Decimal (not NaN) | 任意の値 | 最初の引数。 | 
| その他の値 | 任意の値 | 最初の引数。 | 

## newuuid()
<a name="iot-sql-function-newuuid"></a>

16 バイトのランダムな UUID を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `newuuid()` = `123a4567-b89c-12d3-e456-789012345000`

## numbytes(文字列)
<a name="iot-sql-function-numbytes"></a>

指定された文字列の UTF-8 エンコードのバイト数を返します。標準変換ルールは、非 `String` 引数に適用されます。SQL バージョン 2016-03-23 以降でサポートされています。

例:

`numbytes("hi")` = 2

`numbytes("€") ` = 3

## parse\$1time(String, Long[, String])
<a name="iot-sql-function-parse-time"></a>

`parse_time` 機能を使用して、タイムスタンプを人間が判読可能な日付/時刻形式にフォーマットします。SQL バージョン 2016-03-23 以降でサポートされています。タイムスタンプ文字列をミリ秒に変換するには、「[time\$1to\$1epoch(String, String)](#iot-sql-function-time-to-epoch)」を参照してください。

`parse_time` 関数は次の引数を想定します。

pattern  
(文字列) [Joda-Time フォーマット](http://www.joda.org/joda-time/apidocs/org/joda/time/format/DateTimeFormat.html)に従う日付/時刻パターン。

timestamp  
(ロング) Unix エポックからミリ秒単位でフォーマットされる時間。関数「[timestamp()](#iot-function-timestamp)」を参照してください。

timezone  
(文字列) フォーマットされた日付/時刻のタイムゾーン。デフォルトは「UTC」です。この関数は、「[Joda-Time のタイムゾーン](http://joda-time.sourceforge.net/timezones.html)」をサポートしています。この引数はオプションです。

例:

このメッセージがトピック「A/B」に公開されると、ペイロード `{"ts": "1970.01.01 AD at 21:46:40 CST"}` が S3 バケットに送信されます。

```
{
    "ruleArn": "arn:aws:iot:us-east-2:ACCOUNT_ID:rule/RULE_NAME",
    "topicRulePayload": {
        "sql": "SELECT parse_time(\"yyyy.MM.dd G 'at' HH:mm:ss z\", 100000000, 'America/Belize' ) as ts FROM 'A/B'",

        "ruleDisabled": false,
        "awsIotSqlVersion": "2016-03-23",
        "actions": [
            {
                "s3": {
                    "roleArn": "arn:aws:iam::ACCOUNT_ID:rule:role/ROLE_NAME",
                    "bucketName": "BUCKET_NAME",
                    "key": "KEY_NAME"
                }
            }
        ],
        "ruleName": "RULE_NAME"
    }
}
```

このメッセージがトピック「A/B」に公開されると、`{"ts": "2017.06.09 AD at 17:19:46 UTC"}` (ただし、現在の日付/時刻) と同様のペイロードが S3 バケットに送信されます。

```
{
    "ruleArn": "arn:aws:iot:us-east-2:ACCOUNT_ID:rule/RULE_NAME",
    "topicRulePayload": {
        "sql": "SELECT parse_time(\"yyyy.MM.dd G 'at' HH:mm:ss z\", timestamp() ) as ts FROM 'A/B'",
        "awsIotSqlVersion": "2016-03-23",
        "ruleDisabled": false,
        "actions": [
            {
                "s3": {
                    "roleArn": "arn:aws:iam::ACCOUNT_ID:rule:role/ROLE_NAME",
                    "bucketName": "BUCKET_NAME",
                    "key": "KEY_NAME"
                }
            }
        ],
        "ruleName": "RULE_NAME"
    }
}
```

`parse_time()` は、置換テンプレートとしても使用できます。たとえば、このメッセージがトピック「A/B」に公開されると、ペイロードは S3 バケットに key = 「2017」で送信されます。

```
{
    "ruleArn": "arn:aws:iot:us-east-2:ACCOUNT_ID:rule/RULE_NAME",
    "topicRulePayload": {
        "sql": "SELECT * FROM 'A/B'",
        "awsIotSqlVersion": "2016-03-23",
        "ruleDisabled": false,
        "actions": [{
            "s3": {
                "roleArn": "arn:aws:iam::ACCOUNT_ID:rule:role/ROLE_NAME",
                "bucketName": "BUCKET_NAME",
                "key": "${parse_time('yyyy', timestamp(), 'UTC')}"
            }
        }],
        "ruleName": "RULE_NAME"
    }
}
```

## power(10 進数、10 進数)
<a name="iot-func-power"></a>

最初の引数を 2 番目の引数の累乗にして返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。SQL バージョン 2015-10-08 以降でサポートされています。

例: `power(2, 5)` = 32.0。


****  

| 引数の型 1 | 引数の型 2 | 出力 | 
| --- | --- | --- | 
| Int/Decimal | Int/Decimal | Decimal「倍精度で」、最初の引数を 2 番目の引数の累乗にします。 | 
| Int/Decimal/String | Int/Decimal/String | Decimal(倍精度で)、最初の引数を 2 番目の引数の累乗にします。すべての文字列は小数に変換されます。いずれかの String が Decimal への変換に失敗したら、結果は Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## principal()
<a name="iot-sql-function-principal"></a>

トリガーメッセージの発行方法に基づいて、デバイスが認証に使用するプリンシパルを返します。次の表は、発行方法とプロトコルごとに返されるプリンシパルについて説明しています。


****  

| メッセージの発行方法 | プロトコル | 認証情報のタイプ | プリンシパル | 
| --- | --- | --- | --- | 
| MQTT クライアント | MQTT | X.509 デバイス証明書 | X.509 証明書のサムプリント | 
| AWS IoT コンソール MQTT クライアント | MQTT | IAM ユーザーまたはロール | iam-role-id:session-name | 
| AWS CLI | HTTP | IAM ユーザーまたはロール | userid | 
| AWS IoT デバイス SDK | MQTT | X.509 デバイス証明書 | X.509 証明書のサムプリント | 
| AWS IoT デバイス SDK | MQTT over WebSocket | IAM ユーザーまたはロール | userid | 

次の例は、`principal()` が返すことができるさまざまなタイプの値を示しています。
+ X.509 証明書のサムプリント: `ba67293af50bf2506f5f93469686da660c7c844e7b3950bfb16813e0d31e9373`
+ IAM ロール ID とセッション名: `ABCD1EFG3HIJK2LMNOP5:my-session-name`
+ ユーザー ID: `ABCD1EFG3HIJK2LMNOP5` を返します

## rand()
<a name="iot-sql-function-rand"></a>

0.0 から 1.0 までの間で疑似ランダムで、均等に分散された倍を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`rand()` = 0.8231909191640703

## regexp\$1matches(文字列、文字列)
<a name="iot-func-regex-matches"></a>

文字列 (最初の引数) に、正規表現 (2 番目の引数) の一致が含まれている場合は、true を返します。正規表現で `|` を使用する場合は、`()` で使用します。

例:

`regexp_matches("aaaa", "a{2,}") ` = true。

`regexp_matches("aaaa", "b")` = false。

`regexp_matches("aaa", "(aaa|bbb)") ` = true。

`regexp_matches("bbb", "(aaa|bbb)") ` = true。

`regexp_matches("ccc", "(aaa|bbb)") ` = false。


**最初の引数:**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | String の Int 表現。 | 
| Decimal | String の Decimal 表現。 | 
| Boolean | ブール (「true」または「false」) の String 表現。 | 
| String | 。String | 
| 配列 | String の Array 表現 (標準変換ルールを使用)。 | 
| オブジェクト | オブジェクトの String 表現 (標準変換ルールを使用)。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

*2 番目の引数:*

有効な正規表現の式である必要があります。非文字列型は標準変換ルールを使用して `String` に変換されます。型により、結果として生じる文字列が有効な正規表現でない場合もあります。(変換された) 引数が有効な正規表現でない場合、結果は `Undefined` です。

## regexp\$1replace(文字列、文字列、文字列)
<a name="iot-func-regex-replace"></a>

最初の引数にある 2 番目の引数 (正規表現) の出現すべてを 3 番目の引数で置き換えます。「\$1」でキャプチャグループを参照します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`regexp_replace("abcd", "bc", "x")` = "axd"。

`regexp_replace("abcd", "b(.*)d", "$1")` = "ac"。


**最初の引数:**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | String の Int 表現。 | 
| Decimal | String の Decimal 表現。 | 
| Boolean | ブール (「true」または「false」) の String 表現。 | 
| String | ソース値。 | 
| 配列 | String の Array 表現 (標準変換ルールを使用)。 | 
| オブジェクト | オブジェクトの String 表現 (標準変換ルールを使用)。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

*2 番目の引数:*

有効な正規表現の式である必要があります。非文字列型は標準変換ルールを使用して `String` に変換されます。型により、結果として生じる文字列が有効な正規表現でない場合もあります。(変換された) 引数が有効な正規表現でない場合、結果は `Undefined` です。

*3 番目の引数:*

有効な正規表現の置換文字列である必要があります。(キャプチャグループを参照できます。) 非文字列型は標準変換ルールを使用して `String` に変換されます。(変換された) 引数が有効な正規表現の置換文字列でない場合、結果は `Undefined` です。

## regexp\$1substr(文字列、文字列)
<a name="iot-func-regex-substr"></a>

最初のパラメータにある 2 番目のパラメータ (正規表現) の最初の一致を見つけます。「\$1」でキャプチャグループを参照します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`regexp_substr("hihihello", "hi")` = "hi"

`regexp_substr("hihihello", "(hi)*")` = "hihi"


**最初の引数:**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | String の Int 表現。 | 
| Decimal | String の Decimal 表現。 | 
| Boolean | ブール (「true」または「false」) の String 表現。 | 
| String | String引数。 | 
| 配列 | String の Array 表現 (標準変換ルールを使用)。 | 
| オブジェクト | オブジェクトの String 表現 (標準変換ルールを使用)。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

*2 番目の引数:*

有効な正規表現の式である必要があります。非文字列型は標準変換ルールを使用して `String` に変換されます。型により、結果として生じる文字列が有効な正規表現でない場合もあります。(変換された) 引数が有効な正規表現でない場合、結果は `Undefined` です。

## remainder(Decimal, Decimal)
<a name="iot-func-remainder"></a>

最初の引数を 2 番目の引数で割ったときの剰余を返します。[mod(10 進数、10 進数)](#iot-func-mod) と同等です。同じモジュロ機能に挿入演算子として「%」も使用できます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `remainder(8, 3)` = 2。


****  

| 左のオペランド | 右のオペランド | 出力 | 
| --- | --- | --- | 
| Int | Int | Int、最初の引数を 2 番目の引数で割ったときの剰余。 | 
| Int/Decimal | Int/Decimal | Decimal、最初の引数を 2 番目のオペランドで割ったときの剰余。 | 
| String/Int/Decimal | String/Int/Decimal | すべての文字列を小数に変換した場合、結果は、最初の引数を 2 番目の引数で割ったときの剰余です。そうでない場合は、Undefined です。 | 
| その他の値 | その他の値 | Undefined. | 

## replace(String, String, String)
<a name="iot-func-replace"></a>

最初の引数にある 2 番目の引数の出現すべてを 3 番目の引数で置き換えます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`replace("abcd", "bc", "x")` = `"axd"`.

`replace("abcdabcd", "b", "x")` = `"axcdaxcd"`.


**すべての引数**  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | String の Int 表現。 | 
| Decimal | String の Decimal 表現。 | 
| Boolean | ブール (「true」または「false」) の String 表現。 | 
| String | ソース値。 | 
| 配列 | String の Array 表現 (標準変換ルールを使用)。 | 
| オブジェクト | オブジェクトの String 表現 (標準変換ルールを使用)。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## rpad(文字列、Int)
<a name="iot-func-rpad"></a>

2 番目の引数で指定された数のスペースを右詰めにした文字列の引数を返します。`Int` 引数は、0 ～ 1000 の間である必要があります。提供された値がこの有効な範囲の外にある場合は、引数は最も近い有効な値に設定されます (0 または 1000)。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`rpad("hello", 2)` = "`hello  `".

`rpad(1, 3)` = "`1   `".


****  

| 引数の型 1 | 引数の型 2 | 結果 | 
| --- | --- | --- | 
| String | Int | String は、提供された Int と同じ数のスペースを右詰めにされています。 | 
| String | Decimal | Decimal 引数は最も近い Int に切り下げられ、文字列は、提供された Int と同じ数のスペースを右詰めにされています。 | 
| String | String | 2 番目の引数は Decimal に変換され、最も近い Int に切り下げられます。String は、Int 値と同じ数のスペースを右詰めにされています。 | 
| その他の値 | Int/Decimal/String | 最初の値は、標準変換ルールを使用して String に変換された後、rpad 関数がその String に適用されます。それが変換できない場合、結果は Undefined です。 | 
| 任意の値 | その他の値 | Undefined. | 

## round(10 進数)
<a name="iot-func-round"></a>

指定の `Decimal` を最も近い `Int` に丸めます。`Decimal` が 2 つの `Int` 値と等距離である場合 (例: 0.5)、`Decimal` は丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `Round(1.2)` = 1。

`Round(1.5)` = 2.

`Round(1.7)` = 2.

`Round(-1.1)` = -1.

`Round(-1.5)` = -2.


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 引数。 | 
| Decimal | Decimal は、最も近い Int に切り下げられます。 | 
| String | Decimal は、最も近い Int に切り下げられます。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| その他の値 | Undefined. | 

## rtrim(文字列)
<a name="iot-func-rtrim"></a>

提供される `String` から末尾の空白 (タブとスペース) をすべて削除します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`rtrim(" h i ")` = " h i"


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | String の Int 表現。 | 
| Decimal | String の Decimal 表現。 | 
| Boolean | ブール (「true」または「false」) の String 表現。 | 
| 配列 | String の Array 表現 (標準変換ルールを使用)。 | 
| オブジェクト | オブジェクトの String 表現 (標準変換ルールを使用)。 | 
| Null | Undefined. | 
| 未定義 | Undefined | 

## sign(10 進数)
<a name="iot-func-sign"></a>

指定された数値の符号を返します。引数の符号が正の場合、1 を返します。引数の符号が負の場合、-1 を返します。引数が 0 の場合、0 を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`sign(-7)` = -1.

`sign(0)` = 0.

`sign(13)` = 1.


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Int、Int の値の符号。 | 
| Decimal | Int、Decimal の値の符号。 | 
| String | Int、Decimal の値の符号。文字列は Decimal の値に変換され、Decimal の値の符号が返されます。String が Decimal に変換できない場合、結果は Undefined です。SQL バージョン 2015-10-08 以降でサポートされています。 | 
| その他の値 | Undefined. | 

## sin(10 進数)
<a name="iot-func-sin"></a>

数値のサインをラジアンで返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `sin(0)` = 0.0


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数のサイン。 | 
| Decimal | Decimal (倍精度で)、引数のサイン。 | 
| Boolean | Undefined. | 
| String | Decimal (倍精度で)、引数のサイン。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| Undefined | Undefined. | 

## sinh(10 進数)
<a name="iot-func-sinh"></a>

数値のハイパーボリックサインを返します。`Decimal` 値は関数適用の前に倍精度に丸められます。結果は倍精度の `Decimal` 値です。SQL バージョン 2015-10-08 以降でサポートされています。

例: `sinh(2.3)` = 4.936961805545957


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal (倍精度で)、引数のハイパーボリックサイン。 | 
| Decimal | Decimal (倍精度で)、引数のハイパーボリックサイン。 | 
| Boolean | Undefined. | 
| String | Decimal (倍精度で)、引数のハイパーボリックサイン。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## sourceip()
<a name="iot-function-sourceip"></a>

デバイスまたはそれに接続するルーターの IP アドレスを取得します。デバイスがインターネットに直接接続されている場合、この関数はデバイスの送信元 IP アドレスを返します。デバイスがインターネットに接続するルーターに接続されている場合、関数はルーターの送信元 IP アドレスを返します。SQL バージョン 2016-03-23 でサポートされています。`sourceip()` はパラメータを取得しません。

**重要**  
デバイスの公開送信元 IP アドレスは、多くの場合、インターネットサービスプロバイダーのルーターやケーブルモデムなどの最新のネットワークアドレス変換 (NAT) ゲートウェイの IP アドレスです。

例: 

`sourceip()="192.158.1.38"`

`sourceip()="1.102.103.104"`

`sourceip()="2001:db8:ff00::12ab:34cd"`

SQL 例:

`SELECT *, sourceip() as deviceIp FROM 'some/topic'`

 AWS IoT Core ルールアクションで sourceip() 関数を使用する方法の例:

**例 1**

次の例は、[DynamoDB アクション](https://docs.aws.amazon.com//iot/latest/developerguide/dynamodb-rule-action.html)で () 関数を[代替テンプレート](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html)として呼び出す方法を示しています。

```
{
	"topicRulePayload": {
		"sql": "SELECT * AS message FROM 'some/topic'",
		"ruleDisabled": false,
		"awsIotSqlVersion": "2016-03-23",
		"actions": [
			{
				"dynamoDB": {
					"tableName": "my_ddb_table",
					"hashKeyField": "key",
					"hashKeyValue": "${sourceip()}",
					"rangeKeyField": "timestamp",
					"rangeKeyValue": "${timestamp()}",
					"roleArn": "arn:aws:iam::123456789012:role/aws_iot_dynamoDB"
				}
			}
		]
	}
}
```

**例 2**

次の例は、[代替テンプレート](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html)を使用して sourceip () 関数を MQTT ユーザープロパティとして追加する方法を示しています。

```
{
	"topicRulePayload": {
		"sql": "SELECT * FROM 'some/topic'",
		"ruleDisabled": false,
		"awsIotSqlVersion": "2016-03-23",
		"actions": [
			{
				"republish": {
					"topic": "${topic()}/republish",
					"roleArn": "arn:aws:iam::123456789012:role/aws_iot_republish",
					"headers": {
						"payloadFormatIndicator": "UTF8_DATA",
						"contentType": "rule/contentType",
						"correlationData": "cnVsZSBjb3JyZWxhdGlvbiBkYXRh",
						"userProperties": [
							{
								"key": "ruleKey1",
								"value": "ruleValue1"
							},
							{
								"key": "sourceip",
								"value": "${sourceip()}"
							}
						]
					}
				}
			}
		]
	}
}
```

メッセージブローカーと[基本的な取り込み](https://docs.aws.amazon.com//iot/latest/developerguide/iot-basic-ingest.html)パスの両方から AWS IoT Core ルールに渡すメッセージからソース IP アドレスを取得できます。IPv4 と IPv6 の両方のメッセージの両方の送信元 IP アドレスを使用できます。送信元 IP は次のように表示されます。

IPv6: `yyyy:yyyy:yyyy::yyyy:yyyy`

IPv4:`xxx.xxx.xxx.xxx`

**注記**  
元の送信元 IP は [Republish アクション](republish-rule-action.md)には渡されません。

## substring(String, Int[, Int])
<a name="iot-func-substring"></a>

1 つか 2 つの `String` 値が続く `Int` を予想します。`String` および単一の `Int` 引数では、この関数は提供された `String` インデックス (ゼロベース、包括) から `Int` の端までの提供された `String` のサブストリングを返します。`String` および 2 つの `Int` 引数では、この関数は、最初の `String` インデックス引数 (ゼロベース、包括) から 2 番目の `Int` インデックス引数 (ゼロベース、除外) までの提供された `Int` のサブストリングを返します。ゼロ以下のインデックスはゼロに設定されます。`String` の長さを超過するインデックスは `String` の長さに設定されます。3 つの引数バージョンでは、最初のインデックスが 2 番目インデックスより大きい (または等しい) 場合、結果は空の `String` です。

 提供された引数が (*String*, *Int*)、または (*String*, *Int*, *Int*) でない場合、引数に標準変換が適用され、正しい型への変換が試行されます。型が変換できない場合、関数の結果は `Undefined` です。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`substring("012345", 0)` = "012345"。

`substring("012345", 2)` = "2345"。

`substring("012345", 2.745)` = "2345"。

`substring(123, 2)` = "3"。

`substring("012345", -1)` = "012345"。

`substring(true, 1.2)` = "rue"。

`substring(false, -2.411E247)` = "false"。

`substring("012345", 1, 3)` = "12"。

`substring("012345", -50, 50)` = "012345"。

`substring("012345", 3, 1)` = "".

## sql\$1version()
<a name="iot-sql-function-sql-version"></a>

このルールで指定されている SQL バージョンを返します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`sql_version()` = "2016-03-23"

## sqrt(10 進数)
<a name="iot-func-sqrt"></a>

数値の平方根を返します。`Decimal` 引数は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `sqrt(9)` = 3.0。


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | 引数の平方根。 | 
| Decimal | 引数の平方根。 | 
| Boolean | Undefined. | 
| String | 引数の平方根。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## startswith(文字列、文字列)
<a name="iot-func-startswith"></a>

最初の文字列引数が 2 番目の文字列引数で始まるかどうか、`Boolean` を返します。どちらかの引数が `Null` または `Undefined` の場合、結果は `Undefined` です。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`startswith("ranger","ran")` = true


****  

| 引数の型 1 | 引数の型 2 | 結果 | 
| --- | --- | --- | 
| String | String | 最初の文字列が 2 番目の文字列で始まるかどうか。 | 
| その他の値 | その他の値 | 両方の引数は標準変換ルールを使用して文字列に変換されます。最初の文字列が 2 番目の文字列で始まる場合は true を返します。どちらかの引数が Null または Undefined の場合、結果は Undefined です。 | 

## tan(10 進数)
<a name="iot-func-tan"></a>

数値のタンジェントをラジアンで返します。`Decimal` 値は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `tan(3)` = -0.1425465430742778


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数のタンジェント。 | 
| Decimal | Decimal 「倍精度で」、引数のタンジェント。 | 
| Boolean | Undefined. | 
| String | Decimal 「倍精度で」、引数のタンジェント。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## tanh(10 進数)
<a name="iot-func-tanh"></a>

数値のハイパーボリックタンジェントをラジアンで返します。`Decimal` 値は関数適用の前に倍精度に丸められます。SQL バージョン 2015-10-08 以降でサポートされています。

例: `tanh(2.3)` = 0.9800963962661914


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | Decimal 「倍精度で」、引数の双曲線タンジェント。 | 
| Decimal | Decimal 「倍精度で」、引数の双曲線タンジェント。 | 
| Boolean | Undefined. | 
| String | Decimal 「倍精度で」、引数の双曲線タンジェント。文字列が Decimal に変換できない場合、結果は Undefined です。 | 
| 配列 | Undefined. | 
| オブジェクト | Undefined. | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## time\$1to\$1epoch(String, String)
<a name="iot-sql-function-time-to-epoch"></a>

`time_to_epoch` 関数を使用して、タイムスタンプ文字列を Unix エポック時間のミリ秒数に変換します。SQL バージョン 2016-03-23 以降でサポートされています。ミリ秒をフォーマットされたタイムスタンプ文字列に変換するには、「[parse\$1time(String, Long[, String])](#iot-sql-function-parse-time)」を参照してください。

`time_to_epoch` 関数は次の引数を想定します。

timestamp  
(文字列) Unix エポックからミリ秒に変換されるタイムスタンプ文字列。タイムスタンプ文字列がタイムゾーンを指定しない場合、関数は UTC タイムゾーンを使用します。

pattern  
(文字列) [JDK11 Time フォーマット](http://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/format/DateTimeFormatter.html)に従う日付/時刻パターン。

例:

`time_to_epoch("2020-04-03 09:45:18 UTC+01:00", "yyyy-MM-dd HH:mm:ss VV")` = 1585903518000

`time_to_epoch("18 December 2015", "dd MMMM yyyy")` = 1450396800000

`time_to_epoch("2007-12-03 10:15:30.592 America/Los_Angeles", "yyyy-MM-dd HH:mm:ss.SSS z")` = 1196705730592

## timestamp()
<a name="iot-function-timestamp"></a>

 AWS IoT ルールエンジンによって観測された 1970 年 1 月 1 日木曜日の協定世界時 (UTC) からの現在のタイムスタンプをミリ秒単位で返します。SQL バージョン 2015-10-08 以降でサポートされています。

例: `timestamp()` = `1481825251155`

## topic(10 進数)
<a name="iot-function-topic"></a>

ルールをトリガーしたメッセージが送信されたトピックを返します。パラメータが指定されていない場合、トピック全体が返されます。`Decimal` パラメータは、特定のトピックセグメントを指定するために使用され、1 は最初のセグメントを表します。`foo/bar/baz` トピックでは、topic(1) は `foo` を返し、topic(2) は `bar` を返す、と続いていきます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`topic()` = "things/myThings/thingOne"

`topic(1)` = "things"

[基本的な取り込み](iot-basic-ingest.md)が使用されている場合、トピック (`$aws/rules/rule-name`) の最初のプレフィックスは topic() 関数では使用できません。たとえば、次のトピックがあるとします。

`$aws/rules/BuildingManager/Buildings/Building5/Floor2/Room201/Lights`

`topic()` = "Buildings/Building5/Floor2/Room201/Lights"

`topic(3)` = "Floor2"

## traceid()
<a name="iot-sql-function-traceid"></a>

MQTT メッセージのトレース ID (UUID) を返すか、または、メッセージが MQTT 経由で送信されなかった場合は `Undefined` を返します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`traceid() ` = "12345678-1234-1234-1234-123456789012"

## transform(String, Object, Array)
<a name="iot-func-transform"></a>

`Array` パラメータの `Object` パラメータの指定された変換の結果を含むオブジェクトの配列を返します。

SQL バージョン 2016-03-23 以降でサポートされています。

文字列  
使用する変換モード。サポートされている変換モードと、`Object` および `Array` パラメータから `Result` を作成する方法については、次の表を参照してください。

オブジェクト  
`Array` の各要素に適用する属性を含むオブジェクト。

配列  
`Object` の属性が適用されるオブジェクトの配列。  
この配列内の各オブジェクトは、関数の応答内のオブジェクトに対応します。関数の応答の各オブジェクトには、元のオブジェクトに存在する属性と、`String` で指定された変換モードによって決定される `Object` によって提供される属性が含まれます。


| `String` パラメータ | `Object` パラメータ | `Array` パラメータ | 結果 | 
| --- | --- | --- | --- | 
| `enrichArray` | オブジェクト | オブジェクトの配列 | 各オブジェクトに `Array` パラメータの要素の属性と `Object` パラメータの属性が含まれるオブジェクトの配列。 | 
| その他の値 | 任意の値 | 任意の値 | 未定義 | 

**注記**  
この関数によって返される配列は 128 KiB に制限されています。

### 変換関数の例 1
<a name="iot-func-transform-example1"></a>

この例では、**transform()** 関数がデータオブジェクトと配列からオブジェクトの単一の配列を生成する方法を示します。

この例では、次のメッセージが MQTT トピック `A/B` に発行されます。

```
{
    "attributes": {
        "data1": 1,
        "data2": 2
    },
    "values": [
        {
            "a": 3
        },
        {
            "b": 4
        },
        {
            "c": 5
        }
    ]
}
```

トピックルールアクションのこの SQL ステートメントでは、`String` 値が `enrichArray` である **transform()** 関数を使用します。この例では、`Object` はメッセージペイロードの `attributes` プロパティで、`Array` は 3 つのオブジェクトを含む `values` 配列です。

```
select value transform("enrichArray", attributes, values) from 'A/B'
```

メッセージペイロードを受信すると、SQL ステートメントは次の応答と評価されます。

```
[
  {
    "a": 3,
    "data1": 1,
    "data2": 2
  },
  {
    "b": 4,
    "data1": 1,
    "data2": 2
  },
  {
    "c": 5,
    "data1": 1,
    "data2": 2
  }
]
```

### 変換関数の例 2
<a name="iot-func-transform-example2"></a>

この例では、**transform()** 関数がリテラル値を使用して、メッセージペイロードの個々の属性を含めて、名前を変更する方法を示します。

この例では、次のメッセージが MQTT トピック `A/B` に発行されます。これは [変換関数の例 1](#iot-func-transform-example1) で使用されたメッセージと同じものです。

```
{
    "attributes": {
        "data1": 1,
        "data2": 2
    },
    "values": [
        {
            "a": 3
        },
        {
            "b": 4
        },
        {
            "c": 5
        }
    ]
}
```

トピックルールアクションのこの SQL ステートメントでは、`String` 値が `enrichArray` である **transform()** 関数を使用します。**transform()** 関数の `Object` にはメッセージペイロードの値が `attributes.data1` である `key` という単一属性が含まれており、`Array` は、前述の例で使用されたものと同じ 3 つのオブジェクトを含む `values` 配列です。

```
select value transform("enrichArray", {"key": attributes.data1}, values) from 'A/B'
```

メッセージペイロードを受信すると、SQL ステートメントは次の応答と評価されます。応答で `data1` プロパティの名前が `key` になっていることに注意してください。

```
[
  {
    "a": 3,
    "key": 1
  },
  {
    "b": 4,
    "key": 1
  },
  {
    "c": 5,
    "key": 1
  }
]
```

### 変換関数の例 3
<a name="iot-func-transform-example3"></a>

この例では、ネストされた SELECT 句で **transform()** 関数を使用して、複数の属性を選択し、後続の処理のために新しいオブジェクトを作成する方法を示します。

この例では、次のメッセージが MQTT トピック `A/B` に発行されます。

```
{
  "data1": "example",
  "data2": {
    "a": "first attribute",
    "b": "second attribute",
    "c": [
      {
        "x": {
          "someInt": 5,
          "someString": "hello"
        },
        "y": true
      },
      {
        "x": {
          "someInt": 10,
          "someString": "world"
        },
        "y": false
      }
    ]
  }
}
```

この変換関数の `Object` は、メッセージの `data2` オブジェクトの `a` 要素と `b` 要素を含む SELECT ステートメントによって返されるオブジェクトです。`Array` パラメータは、元のメッセージの `data2.c` 配列の 2 つのオブジェクトで構成されます。

```
select value transform('enrichArray', (select a, b from data2), (select value c from data2)) from 'A/B'
```

前述のメッセージにより、SQL ステートメントは次の応答に評価されます。

```
[
  {
    "x": {
      "someInt": 5,
      "someString": "hello"
    },
    "y": true,
    "a": "first attribute",
    "b": "second attribute"
  },
  {
    "x": {
      "someInt": 10,
      "someString": "world"
    },
    "y": false,
    "a": "first attribute",
    "b": "second attribute"
  }
]
```

 この応答で返される配列は、`batchMode` をサポートするトピックルールアクションで使用できます。

## trim(文字列)
<a name="iot-func-trim"></a>

提供された `String` から、すべての先頭および末尾の空白を削除します。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`Trim(" hi ") ` = "hi"


****  

| 引数の型 | 結果 | 
| --- | --- | 
| Int | すべての先頭および末尾の空白が削除された String の Int 表現。 | 
| Decimal | すべての先頭および末尾の空白が削除された String の Decimal 表現。 | 
| Boolean | すべての先頭および末尾の空白が削除された String (「true」または「false」) の Boolean 表現。 | 
| String | すべての先頭および末尾の空白が削除された String。 | 
| 配列 | 標準変換ルールを使用した String の Array 表現。 | 
| オブジェクト | 標準変換ルールを使用したオブジェクトの String 表現。 | 
| Null | Undefined. | 
| 未定義 | Undefined. | 

## trunc(10 進数、Int)
<a name="iot-func-trunc"></a>

2 番目の引数で指定された `Decimal` の場所の数で最初の引数を切り捨てます。2 番目の引数がゼロよりより少ない場合は、ゼロに設定されます。2 番目の引数が 34 より大きい場合は、34 に設定されます。末尾のゼロは結果から省かれます。SQL バージョン 2015-10-08 以降でサポートされています。

例: 

`trunc(2.3, 0)` = 2.

`trunc(2.3123, 2)` = 2.31.

`trunc(2.888, 2)` = 2.88.

`trunc(2.00, 5)` = 2.


****  

| 引数の型 1 | 引数の型 2 | 結果 | 
| --- | --- | --- | 
| Int | Int | ソース値。 | 
| Int/Decimal | Int/Decimal | 最初の引数は 2 番目の引数で説明された長さに切り捨てられます。2 番目の引数は、Int でなければ、最も近い Int に切り下げられます。 | 
| Int/Decimal/String | Int/Decimal | 最初の引数は 2 番目の引数で説明された長さに切り捨てられます。2 番目の引数は、Int でなければ、最も近い Int に切り下げられます。String は Decimal 値に変換されます。文字列変換が失敗した場合、結果は Undefined です。 | 
| その他の値 |  | Undefined. | 

## upper(文字列)
<a name="iot-sql-function-upper"></a>

指定した `String` の大文字バージョンを返します。非 `String` 引数は標準変換のルールを使用して `String` に変換されます。SQL バージョン 2015-10-08 以降でサポートされています。

例:

`upper("hello")` = "HELLO"

`upper(["hello"])` = "[\$1"HELLO\$1"]"

# リテラル
<a name="iot-sql-literals"></a>

ルール SQL の SELECT および WHERE 句で直接リテラルオブジェクトを指定でき、情報を渡すのに役立ちます。

**注記**  
リテラルは SQL バージョン 2016-03-23 以降を使用する場合にのみ利用可能です。

JSON オブジェクトの構文が使用されています (キーと値のペア、カンマ区切り、キーが文字列で値が JSON 値なら波括弧 \$1\$1 で囲む)。以下に例を示します。

トピックに公開された受信ペイロード `topic/subtopic`: `{"lat_long": [47.606,-122.332]}`

SQL ステートメント: `SELECT {'latitude': get(lat_long, 0),'longitude':get(lat_long, 1)} as lat_long FROM 'topic/subtopic'`

結果の出力ペイロードは次のとおりです: `{"lat_long":{"latitude":47.606,"longitude":-122.332}}`。

ルール SQL の SELECT および WHERE 句で直接配列を指定でき、情報をグループ化できます。JSON の構文が使用されています (カンマ区切りの項目を角括弧 [] でラップし、配列リテラルを作成する)。以下に例を示します。

トピックに公開された受信ペイロード `topic/subtopic`: `{"lat": 47.696, "long": -122.332}`

SQL ステートメント: `SELECT [lat,long] as lat_long FROM 'topic/subtopic'`

結果の出力ペイロードは次のとおりです: `{"lat_long": [47.606,-122.332]}`。

# Case ステートメント
<a name="iot-sql-case"></a>

Case ステートメントを使用して、switch ステートメントと同様に、実行のブランチができます。

構文:

```
CASE v WHEN t[1] THEN r[1] 
  WHEN t[2] THEN r[2] ... 
  WHEN t[n] THEN r[n] 
  ELSE r[e] END
```

*`v`* 式が評価され、各 `WHEN` 句の *`t[i]`* 値と等しいかどうか照合されます。一致がある場合は、対応する *`r[i]`* 式が `CASE` ステートメントの結果になります。`WHEN` 句は順番に評価され、一致する句が複数ある場合、最初に一致した句の結果が `CASE` ステートメントの結果になります。一致するものがない場合は、`ELSE` 句の *`r[e]`* が結果です。一致するものがなく、`ELSE` 句もない場合、結果は `Undefined` です。

`CASE` ステートメントには少なくとも 1 つの `WHEN` 句が必要です。`ELSE` 句はオプションです。

例:

トピック `topic/subtopic` に公開された受信ペイロード:

```
{
    "color":"yellow"
}
```

SQL ステートメント: 

```
SELECT CASE color
        WHEN 'green' THEN 'go'
        WHEN 'yellow' THEN 'caution'
        WHEN 'red' THEN 'stop'
        ELSE 'you are not at a stop light' END as instructions
    FROM 'topic/subtopic'
```

結果の出力ペイロードは次のとおりです。

```
{
    "instructions":"caution"
}
```

**注記**  
*`v`* が `Undefined` の場合、CASE ステートメントの結果は `Undefined` です。

# JSON 拡張
<a name="iot-sql-json"></a>

入れ子になった JSON オブジェクトに対応するには、次に示す ANSI SQL 構文への拡張を使用できます。

"." 演算子

この演算子は、埋め込み JSON オブジェクトのメンバーにアクセスします。ANSI SQL や JavaScript の場合と同じ機能があります。以下に例を示します。

```
SELECT foo.bar AS bar.baz FROM 'topic/subtopic'
```

`topic/subtopic` トピックに送信される次のメッセージペイロードから、`foo` オブジェクト内の `bar` プロパティの値を選択します。

```
{
  "foo": {
    "bar": "RED",
    "bar1": "GREEN",
    "bar2": "BLUE"
  }
}
```

JSON プロパティ名にハイフン文字または数字が含まれている場合、「ドット」表記は機能しません。代わりに、[get 関数](iot-sql-functions.md#iot-sql-function-get)を使用してプロパティの値を抽出します。

 この例では、次のメッセージが `iot/rules` トピックに送信されます。

```
{
  "mydata": {
    "item2": {
      "0": {
        "my-key": "myValue"
      }
    }
  }
}
```

通常、`my-key` の値はこのクエリのように識別されます。

```
SELECT * from iot/rules WHERE mydata.item2.0.my-key= "myValue"
```

ただし、プロパティ名`my-key` にはハイフンが含まれ、`item2`には数字が含まれるため、次のクエリが示すように [get 関数](iot-sql-functions.md#iot-sql-function-get)を使用する必要があります。

```
SELECT * from 'iot/rules' WHERE get(get(get(mydata,"item2"),"0"),"my-key") = "myValue"
```

`*` 演算子

ANSI SQL の `*` ワイルドカードと同じ機能があります。SELECT 句のみで使用され、メッセージデータを含む新しい JSON オブジェクトを作成します。メッセージペイロードが JSON 形式でない場合、`*` はメッセージペイロード全体を raw バイトとして返します。以下に例を示します。

```
SELECT * FROM 'topic/subtopic'
```

**属性値に対する関数の適用**  
以下に、デバイスから発行される JSON ペイロードの例を示します。

```
{
    "deviceid" : "iot123",
    "temp" : 54.98,
    "humidity" : 32.43,
    "coords" : {
        "latitude" : 47.615694,
        "longitude" : -122.3359976
    }
}
```

次の例では、JSON ペイロード内の属性値に関数を適用しています。

```
SELECT temp, md5(deviceid) AS hashed_id FROM topic/#
```

このクエリの結果は、次の JSON オブジェクトです。

```
{
   "temp": 54.98,
   "hashed_id": "e37f81fb397e595c4aeb5645b8cbbbd1"
}
```

# 置換テンプレート
<a name="iot-substitution-templates"></a>

代替テンプレートを使用して、ルールがトリガーされてアクションを実行したときに返 AWS IoT される JSON データを拡張できます。置換テンプレートの構文は`${`*式*`}`です。*式*は、SELECT 句、WHERE 句、および AWS IoT で でサポートされている任意の式にすることができます[AWS IoT ルールアクション](iot-rule-actions.md)。この式をルールのアクションフィールドに接続して、アクションを動的に構成できます。実際には、この機能はアクションの情報の一部を置き換えます。これには、関数、演算子、および元のメッセージペイロードに存在する情報が該当します。

**重要**  
置換テンプレート内の式は "SELECT..." ステートメントとは独立して評価されるため、AS 句を使用して作成されたエイリアスを参照することはできません。元のペイロード、[関数](iot-sql-functions.md)、および[演算子](iot-sql-operators.md)に存在する情報のみを参照できます。

サポートされる式の詳細については、「[AWS IoT SQL リファレンス](iot-sql-reference.md)」を参照してください。

次のルールアクションは、置換テンプレートをサポートします。各アクションは、置換可能なさまざまなフィールドをサポートしています。
+ [Apache Kafka](apache-kafka-rule-action.md)
+ [CloudWatch アラーム](cloudwatch-alarms-rule-action.md)
+ [CloudWatch Logs](cloudwatch-logs-rule-action.md)
+ [CloudWatch メトリクス](cloudwatch-metrics-rule-action.md)
+ [DynamoDB](dynamodb-rule-action.md)
+ [DynamoDBv2](dynamodb-v2-rule-action.md)
+ [Elasticsearch](elasticsearch-rule-action.md)
+ [HTTP](https-rule-action.md)
+ [AWS IoT Events](iotevents-rule-action.md)
+ [AWS IoT SiteWise](iotsitewise-rule-action.md)
+ [Kinesis Data Streams](kinesis-rule-action.md)
+ [Firehose](kinesis-firehose-rule-action.md)
+ [Lambda](lambda-rule-action.md)
+ [ロケーション](location-rule-action.md)
+ [OpenSearch](opensearch-rule-action.md)
+ [再発行](republish-rule-action.md)
+ [S3](s3-rule-action.md)
+ [SNS](sns-rule-action.md)
+ [SQS](sqs-rule-action.md)
+ [ステップ関数](stepfunctions-rule-action.md)
+ [Timestream](timestream-rule-action.md)

置換テンプレートは、ルール内のアクションパラメータに表示されます。

```
{
    "sql": "SELECT *, timestamp() AS timestamp FROM 'my/iot/topic'",
    "ruleDisabled": false,
    "actions": [{
        "republish": {
            "topic": "${topic()}/republish",
            "roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
        }
    }]
}
```

このルールが `my/iot/topic` に発行された次の JSON によってトリガーされた場合:

```
{
    "deviceid": "iot123",
    "temp": 54.98,
    "humidity": 32.43,
    "coords": {
        "latitude": 47.615694,
        "longitude": -122.3359976
    }
}
```

次に`my/iot/topic/republish`、このルールは次の JSON を に発行します。これは から AWS IoT 置き換えられます`${topic()}/republish`。

```
{
    "deviceid": "iot123",
    "temp": 54.98,
    "humidity": 32.43,
    "coords": {
        "latitude": 47.615694,
        "longitude": -122.3359976
    },
    "timestamp": 1579637878451
}
```

# ネストされたオブジェクトのクエリ
<a name="iot-sql-nested-queries"></a>

ネストされた SELECT 句を使用して、配列および内部 JSON オブジェクト内の属性を照会できます。SQL バージョン 2016-03-23 以降でサポートされています。

次の MQTT メッセージを考えてみます。

```
{ 
    "e": [
        { "n": "temperature", "u": "Cel", "t": 1234, "v": 22.5 },
        { "n": "light", "u": "lm", "t": 1235, "v": 135 },
        { "n": "acidity", "u": "pH", "t": 1235, "v": 7 }
    ]
}
```

**Example**  
次のルールを使用して、値を新しい配列に変換できます。  

```
SELECT (SELECT VALUE n FROM e) as sensors FROM 'my/topic'
```

この場合、ルールにより、次の出力が生成されます。

```
{
    "sensors": [
        "temperature",
        "light",
        "acidity"
    ]
}
```

**Example**  
同じ MQTT メッセージを使用して、次のルールを使い、ネストされたオブジェクト内の特定の値を照会することもできます。  

```
SELECT (SELECT v FROM e WHERE n = 'temperature') as temperature FROM 'my/topic'
```

この場合、ルールにより、次の出力が生成されます。

```
{
    "temperature": [
        {
            "v": 22.5
        }
    ]
}
```

**Example**  
また、より複雑なルールで出力を平坦化することもできます。  

```
SELECT get((SELECT v FROM e WHERE n = 'temperature'), 0).v as temperature FROM 'topic'
```

この場合、ルールにより、次の出力が生成されます。

```
{
    "temperature": 22.5
}
```

# バイナリペイロードの使用
<a name="binary-payloads"></a>

メッセージのペイロードを raw バイナリデータとして (JSON オブジェクトではなく) 処理するには、\$1 演算子を使用して SELECT 句で参照できます。

**Topics**
+ [

## バイナリペイロードの例
](#binary-payloads-examples)
+ [

## protobuf メッセージペイロードのデコード
](#binary-payloads-protobuf)

## バイナリペイロードの例
<a name="binary-payloads-examples"></a>

メッセージペイロードを raw バイナリデータとして参照するために \$1 を使用するときは、ルールにデータを追加できます。空のペイロードまたは JSON ペイロードがある場合、結果のペイロードには、ルールを使用してデータを追加できます。以下は、サポートされる `SELECT` 句の例です
+ バイナリペイロードに \$1 のみを使用した以下の `SELECT` 句を使用できます。
  + 

    ```
    SELECT * FROM 'topic/subtopic'
    ```
  + 

    ```
    SELECT * FROM 'topic/subtopic' WHERE timestamp() % 12 = 0
    ```
+ データを追加して、以下の `SELECT` 句を使用することもできます。
  + 

    ```
    SELECT *, principal() as principal, timestamp() as time FROM 'topic/subtopic'
    ```
  + 

    ```
    SELECT encode(*, 'base64') AS data, timestamp() AS ts FROM 'topic/subtopic'
    ```
+ これらの `SELECT` 句をバイナリペイロードと使用することもできます。
  + 以下は、WHERE 句の `device_type` を参照します。

    ```
    SELECT * FROM 'topic/subtopic' WHERE device_type = 'thermostat'
    ```
  + 以下もサポートされています。

    ```
    {
    	"sql": "SELECT * FROM 'topic/subtopic'",
    	"actions": [
    		{
    			"republish": {
    				"topic": "device/${device_id}"
    			}
    		}
    	]
    }
    ```

次のルールアクションはバイナリペイロードをサポートしていないので、それらをデコードする必要があります。
+ [Lambdaアクション](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rule-actions.html#lambda-rule)など、バイナリペイロード入力をサポートしないルールアクションの場合は、バイナリペイロードをデコードする必要があります。Lambda ルールアクションは、base64 エンコード済みで JSON ペイロードの場合、バイナリデータを受け取ることができます。ルールを以下のように変更することで、これを実行できます。

  ```
  SELECT encode(*, 'base64') AS data FROM 'my_topic'
  ```
+ SQL ステートメントは、文字列を入力としてサポートしていません。文字列入力を JSON に変換するには、次のコマンドが実行できます。

  ```
  SELECT decode(encode(*, 'base64'), 'base64') AS payload FROM 'topic'
  ```

## protobuf メッセージペイロードのデコード
<a name="binary-payloads-protobuf"></a>

[プロトコルバッファ (protobuf)](https://developers.google.com/protocol-buffers) は、構造化データをコンパクトなバイナリ形式でシリアル化するために使用されるオープンソースのデータ形式です。データをネットワーク経由で送信したり、ファイルに保存したりするために使用されます。Protobuf を使用すると、小さなパケットサイズで他のメッセージング形式よりも高速にデータを送信できます。 AWS IoT Core ルールは、[decode(value, decodingScheme)](iot-sql-functions.md#iot-sql-decode-base64) SQL 関数を提供することで protobuf をサポートします。これにより、protobuf エンコードされたメッセージペイロードを JSON 形式にデコードし、ダウンストリームサービスにルーティングできます。このセクションでは、 AWS IoT Core ルールで protobuf デコードを設定する手順について、順を追って説明します。

**Topics**
+ [

### 前提条件
](#binary-payloads-protobuf-prerequisites)
+ [

### 記述子ファイルの作成
](#binary-payloads-protobuf-descriptor-steps)
+ [

### 記述子ファイルを S3 バケットにアップロードする
](#binary-payloads-protobuf-s3-steps)
+ [

### ルールで protobuf デコードを設定する
](#binary-payloads-protobuf-steps)
+ [

### 制限事項
](#binary-payloads-protobuf-limitations)
+ [

### ベストプラクティス
](#binary-payloads-protobuf-bestpractices)

### 前提条件
<a name="binary-payloads-protobuf-prerequisites"></a>
+ [プロトコルバッファ (protobuf)](https://developers.google.com/protocol-buffers) に関する基本事項の理解
+ メッセージタイプと関連する依存関係を定義する [`.proto` ファイル](https://developers.google.com/protocol-buffers/docs/proto3)
+ システムへの [protobuf コンパイラ (protoc)](https://github.com/protocolbuffers/protobuf/releases) のインストール

### 記述子ファイルの作成
<a name="binary-payloads-protobuf-descriptor-steps"></a>

記述子ファイルが既にある場合は、このステップを省略できます。記述子ファイル (`.desc`) は `.proto` ファイルのコンパイル版で、protobuf のシリアル化で使用されるデータ構造とメッセージタイプを定義するテキストファイルです。記述子ファイルを生成するには、`.proto` ファイルを定義し、[protoc](https://github.com/protocolbuffers/protobuf/releases) コンパイラを使用してそれをコンパイルする必要があります。

1. メッセージタイプを定義する `.proto` ファイルを作成します。`.proto` ファイルの例として、以下のようなものがあります。

   ```
   syntax = "proto3";
   
   message Person {
     optional string name = 1;
     optional int32 id = 2;
     optional string email = 3;
   }
   ```

   この例の `.proto` ファイルでは、proto3 構文を使用してメッセージタイプ `Person` を定義します。`Person` メッセージ定義では、3 つのフィールド (名前、ID、E メール) を指定します。`.proto` ファイルメッセージ形式の詳細については、[言語ガイド (proto3)](https://developers.google.com/protocol-buffers/docs/proto3)を参照してください。

1. [protoc](https://github.com/protocolbuffers/protobuf/releases) コンパイラを使用して、`.proto` ファイルをコンパイルし、記述子ファイルを生成します。descriptor (`.desc`) ファイルを作成するコマンドの例として、次のものがあります。

   ```
   protoc --descriptor_set_out=<FILENAME>.desc \
       --proto_path=<PATH_TO_IMPORTS_DIRECTORY> \
       --include_imports \
       <PROTO_FILENAME>.proto
   ```

   このコマンド例では、記述子ファイル を生成します。このファイル を使用して`<FILENAME>.desc`、 AWS IoT Core で定義されたデータ構造に準拠する protobuf ペイロードをデコードできます`<PROTO_FILENAME>.proto`。
   + `--descriptor_set_out`

     生成する記述子ファイル (`<FILENAME>.desc`) の名前を指定します。
   + `--proto_path`

     コンパイル中の `.proto` ファイルから参照するインポートされたファイルの場所を指定します。インポートされた `.proto` ファイルの場所が異なる場合は、フラグを複数回指定できます。
   + `--include_imports`

     インポートされた `.proto` ファイルもすべてコンパイルして、`<FILENAME>.desc` 記述ファイルに含めるように指定します。
   + `<PROTO_FILENAME>.proto`

     コンパイルする `.proto` ファイルの名前を指定します。

   protoc リファレンスの詳細については、[API リファレンス](https://developers.google.com/protocol-buffers/docs/reference/overview)を参照してください。

### 記述子ファイルを S3 バケットにアップロードする
<a name="binary-payloads-protobuf-s3-steps"></a>

記述子ファイル を作成したら`<FILENAME>.desc`、 AWS API、 AWS SDK、または を使用して、記述子ファイルを `<FILENAME>.desc` Amazon S3 バケットにアップロードします AWS マネジメントコンソール。

**重要な考慮事項**
+ ルールを設定する AWS リージョン のと同じ AWS アカウント の Amazon S3 バケットに記述子ファイルをアップロードしてください。
+ S3 `FileDescriptorSet`から を読み取る AWS IoT Core ためのアクセス許可を必ず付与してください。S3 バケットでサーバー側の暗号化が無効になっている場合、または S3 バケットが Amazon S3 管理キー (SSE-S3) を使用して暗号化されている場合、追加のポリシー設定は必要ありません。これは、バケットポリシーの例で実現できます。  
****  

  ```
  {
  	"Version":"2012-10-17",		 	 	 
  	"Statement": [
  		{
  			"Sid": "Statement1",
  			"Effect": "Allow",
  			"Principal": {
  				"Service": "iot.amazonaws.com"
  			},
  			"Action": "s3:Get*",
                        "Resource": "arn:aws:s3:::<BUCKET NAME>/<FILENAME>.desc"
  		}
  	]
  }
  ```
+ S3 バケットが AWS Key Management Service キー (SSE-KMS) を使用して暗号化されている場合は、S3 バケットにアクセスするときにキーを使用するアクセス AWS IoT Core 許可を付与してください。そのためには、次のステートメントをキーポリシーに追加してください。

  ```
  {
  	"Sid": "Statement1",
  	"Effect": "Allow",
  	"Principal": {
  		"Service": "iot.amazonaws.com"
  	},
  	"Action": [
  		"kms:Decrypt",
  		"kms:GenerateDataKey*",
  		"kms:DescribeKey"
  	],
          "Resource": "arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
  	
  }
  ```

### ルールで protobuf デコードを設定する
<a name="binary-payloads-protobuf-steps"></a>

記述子ファイルを S3 バケットにアップロードしたら、[decode(value, decodingScheme)](iot-sql-functions.md#iot-sql-decode-base64) SQL 関数を使用して、protobuf メッセージペイロード形式をデコードできる[ルール](https://docs.aws.amazon.com//iot/latest/developerguide/iot-create-rule.html)を設定します。詳細な関数の署名と例は、「*AWS IoT SQL リファレンス*」の「[decode(value, decodingScheme)](iot-sql-functions.md#iot-sql-decode-base64) SQL 関数」に記載されています。

[decode(value, decodingScheme)](iot-sql-functions.md#iot-sql-decode-base64) 関数を使用する SQL 式の例としては、次のようなものがあります。

```
SELECT VALUE decode(*, 'proto', '<BUCKET NAME>', '<FILENAME>.desc', '<PROTO_FILENAME>', '<PROTO_MESSAGE_TYPE>') FROM '<MY_TOPIC>'
```

この式の例:
+ [decode(value, decodingScheme)](iot-sql-functions.md#iot-sql-decode-base64) SQL 関数を使用して、`*` から参照されるバイナリメッセージペイロードをデコードします。これは、protobuf でエンコードされたバイナリのペイロード、または base64 でエンコードされた protobuf ペイロードを表す JSON 文字列です。
+ 提供されたメッセージペイロードは、`PROTO_FILENAME.proto` で定義されている `Person` メッセージタイプを使用してエンコードされます。
+ `BUCKET NAME` という名前の Amazon S3 バケットには、`PROTO_FILENAME.proto` から生成された `FILENAME.desc` が含まれます。

設定が完了したら、ルールがサブスクライブされているトピック AWS IoT Core のメッセージを に発行します。

### 制限事項
<a name="binary-payloads-protobuf-limitations"></a>

AWS IoT Core ルールは protobuf をサポートしていますが、以下の制限があります。
+ [置換テンプレート](https://docs.aws.amazon.com//iot/latest/developerguide/iot-substitution-templates.html)内の protobuf メッセージペイロードのデコードはサポートされていません。
+ protobuf メッセージペイロードをデコードする場合、1 つの SQL 式内で [decode SQL 関数](iot-sql-functions.md#iot-sql-decode-base64)を最大 2 回使用できます。
+ インバウンドペイロードの最大サイズは 128 KiB (1KiB = 1024 バイト)、アウトバウンドペイロードの最大サイズは 128 KiB、Amazon S3 バケットに保存される `FileDescriptorSet` オブジェクトの最大サイズは 32 KiB です。
+ SSE-C 暗号化を使用して暗号化された Amazon S3 バケットはサポートされていません。

### ベストプラクティス
<a name="binary-payloads-protobuf-bestpractices"></a>

ここでは、ベストプラクティスおよびトラブルシューティングのヒントを説明します。
+ Amazon S3 バケットに proto ファイルをバックアップする。

  問題が発生した場合に備えて、proto ファイルをバックアップすることをお勧めします。例えば、protoc の実行中にバックアップせずに proto ファイルを誤って変更すると、本稼働スタックで問題が発生する可能性があります。Amazon S3 バケットのファイルをバックアップする方法は複数あります。例えば、[S3 バケットでバージョニングを使用](https://docs.aws.amazon.com//AmazonS3/latest/userguide/Versioning.html)できます。Amazon S3 バケット内のファイルをバックアップする方法の詳細については、「*[Amazon S3 デベロッパーガイド](https://docs.aws.amazon.com//aws-backup/latest/devguide/recovery-points.html)*」を参照してください。
+  AWS IoT ログエントリを表示するようにログ記録を設定します。

  CloudWatch でアカウントの AWS IoT ログをチェックできるように、 AWS IoT ログ記録を設定することをお勧めします。ルールの SQL クエリが外部関数を呼び出すと、 AWS IoT Core Rules は `eventType`の を持つログエントリを生成します。これには`FunctionExecution`、障害のトラブルシューティングに役立つ理由フィールドが含まれます。Amazon S3 オブジェクトが見つからない、または無効な protobuf ファイル記述子が含まれていることが考えられます。 AWS IoT ロギングを設定する方法とログエントリを確認する方法の詳細については、「[AWS IoT ロギングの設定](https://docs.aws.amazon.com//iot/latest/developerguide/configure-logging.html)」と「[ルールエンジンのログエントリ](https://docs.aws.amazon.com//iot/latest/developerguide/cwl-format.html#log-rules-fn-exec)」を参照してください。
+ 新しいオブジェクトキーを使用して `FileDescriptorSet` を更新し、ルール内のオブジェクトキーを更新する。

  更新された記述子ファイルを Amazon S3 バケットにアップロードすることで `FileDescriptorSet` を更新できます。`FileDescriptorSet` への更新が反映されるまで、最大 15 分かかる場合があります。この遅延を避けるため、新しいオブジェクトキーを使用して更新した `FileDescriptorSet` をアップロードし、ルール内のオブジェクトキーを更新することをお勧めします。

# SQL バージョン
<a name="iot-rule-sql-version"></a>

 AWS IoT ルールエンジンは、SQL のような構文を使用して MQTT メッセージからデータを選択します。SQL ステートメントは、ルールが記述されている JSON ドキュメント内の `awsIotSqlVersion` プロパティで指定された SQL バージョンに基づいて解釈されます。JSON ルールドキュメントの構造については、「[ルールの作成](iot-create-rule.md)」を参照してください。`awsIotSqlVersion` プロパティを使用すると、使用する AWS IoT SQL ルールエンジンのバージョンを指定できます。新しいバージョンをデプロイした場合は、引き続き古いバージョンを使用することも、新しいバージョンを使用できるようにルールを変更することもできます。現在のルールでは、ルールの作成時のバージョンが引き続き使用されます。

以下の JSON 例は、`awsIotSqlVersion` プロパティを使用して SQL バージョンを指定する方法を示しています。

```
{
    "sql": "expression",
    "ruleDisabled": false,
    "awsIotSqlVersion": "2016-03-23",
    "actions": [{
        "republish": {
            "topic": "my-mqtt-topic",
            "roleArn": "arn:aws:iam::123456789012:role/my-iot-role"
        }
    }]
}
```

AWS IoT は現在、次の SQL バージョンをサポートしています。
+ `2016-03-23` – 2016 年 3 月 23 日にビルドされた SQL バージョン (推奨)。
+ `2015-10-08` – 2015 年 10 月 8 日にビルドされた元の SQL バージョン。
+ `beta` – 最新のベータ SQL バージョン。このバージョンでは、ルールへの変更が必要になる場合があります。

## SQL ルールエンジン 2016-03-23 バージョンの最新情報
<a name="sql-2016-03-23-beta"></a>
+ 入れ子になっている JSON オブジェクトの選択が修正されました。
+ 配列クエリに関する修正が行われました。
+ オブジェクト間でのクエリがサポートされるようになりました。詳細については、「[ネストされたオブジェクトのクエリ](iot-sql-nested-queries.md)」を参照してください。
+ 最上位レベルのオブジェクトとして配列を出力できるようになりました。
+ JSON および非 JSON 形式のデータに適用できる `encode(value, encodingScheme)` 関数の追加。詳細については、「[encode 関数](iot-sql-functions.md#iot-sql-encode-payload)」を参照してください。

### 最上位レベルのオブジェクトとして `Array` を出力する
<a name="return-array-rule"></a>

この機能を使用すると、ルールから、最上位レベルのオブジェクトとして配列を返すことができます。たとえば、次の MQTT メッセージの場合:

```
{
    "a": {"b":"c"},
    "arr":[1,2,3,4]
}
```

次のルールを使用します。

```
SELECT VALUE arr FROM 'topic'
```

この場合、ルールにより、次の出力が生成されます。

```
[1,2,3,4]
```