

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

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

Utilizzate la clausola SET per definire le variabili che memorizzano i risultati delle espressioni. È possibile riutilizzare queste variabili nelle clausole SELECT e WHERE e nei modelli sostitutivi. Ciò consente di evitare la duplicazione di espressioni complesse e di ridurre il numero di chiamate di funzione nell'istruzione SQL.

La clausola SET supporta[Tipi di dati](iot-sql-data-types.md),,[Operatori](iot-sql-operators.md),[Funzioni](iot-sql-functions.md), [Valori letterali](iot-sql-literals.md) [Istruzioni case](iot-sql-case.md)[Estensioni JSON](iot-sql-json.md), [Variabili](#iot-sql-set-usage) e. [Query di oggetti nidificati](iot-sql-nested-queries.md)

## Sintassi della clausola SET
<a name="iot-sql-set-syntax"></a>

La clausola SET deve comparire prima della clausola SELECT nell'istruzione SQL. Utilizzare la seguente sintassi:

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

Regole di sintassi:
+ Inizia i nomi delle variabili con `@`
+ I nomi delle variabili possono contenere lettere, numeri e caratteri di sottolineatura
+ I nomi delle variabili possono avere una lunghezza massima di 64 caratteri
+ È possibile impostare più variabili in una singola clausola SET, separate da virgole
+ Ogni variabile può essere assegnata una sola volta (le variabili sono immutabili)
+ La parola chiave SET può essere utilizzata solo una volta per istruzione SQL

## Utilizzo di variabili
<a name="iot-sql-set-usage"></a>

Dopo aver definito le variabili, puoi usarle in:
+ Clausole SELECT
+ Clausole WHERE
+ Altre assegnazioni di variabili SET
+ Modelli di sostituzione delle azioni
+ Modelli di sostituzione delle azioni di errore
+ Interrogazioni SELECT annidate
+ Parametri delle funzioni (alcuni parametri come i parametri ROLearn e i parametri che modificano la modalità di una funzione in modo simile a `transform("enrichArray", attributes, values)` non supportare le variabili)

Le variabili vengono referenziate utilizzando la stessa `@variable_name` sintassi utilizzata nella clausola SET. È inoltre possibile utilizzare la sintassi dell'estensione JSON per accedere alle proprietà delle variabili che contengono oggetti, ad esempio. `@variable_name.property`

## Esempi di clausole SET
<a name="iot-sql-set-examples"></a>

**Utilizzo delle variabili di base**

L'esempio seguente mostra un payload pubblicato sull'argomento`device/data`: `{"temp_fahrenheit": 75, "humidity": 60}`

Istruzione SQL:

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

Payload in uscita: `{"celsius": 23.89, "humidity": 60}`

**Accedi ai membri negli oggetti JSON incorporati**

L'esempio seguente mostra un payload pubblicato sull'argomento: `device/data` `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

Istruzione 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'
```

Payload in uscita: `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 per ulteriori informazioni su come lavorare con le estensioni JSON, consulta [Estensioni JSON](iot-sql-json.md) 

**Evitare chiamate di funzione duplicate**

Le variabili SET aiutano a evitare la duplicazione di operazioni di decodifica complesse:

```
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
```

Senza le variabili SET, sarebbe necessario ripetere la funzione di decodifica tre volte, il che supera i limiti di chiamata alla funzione.

**Variabili multiple**

È possibile definire più variabili in una singola clausola SET separandole con virgole:

```
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
```

**Utilizzo di variabili nei modelli sostitutivi**

Le variabili possono essere utilizzate anche nei modelli di sostituzione delle azioni, che consentono di riutilizzare i valori calcolati sia nell'istruzione SQL che nelle azioni delle regole.

Istruzione SQL:

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

Configurazione dell'azione:

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

In questo esempio, la variabile SET `@temp_celsius` viene utilizzata in un modello sostitutivo per costruire il campo chiave dell'azione S3.

**Utilizzo di payload non JSON**

Le variabili SET non supportano direttamente payload non JSON, quindi il payload deve essere prima codificato o decodificato:

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

 per ulteriori informazioni su come lavorare con payload non JSON, consulta [Utilizzo di payload binari](binary-payloads.md) 

## Limiti della clausola SET
<a name="iot-sql-set-limits"></a>

I seguenti limiti si applicano alle variabili SET:
+ Massimo 10 variabili univoche per istruzione SQL
+ Dimensione massima del valore variabile di 128 KiB (stringa JSON UTF-8 minimizzata)
+ Dimensione massima del valore totale di 128 KB per tutte le variabili
+ Nomi di variabili limitati a 64 caratteri
+ Le variabili possono accettare i payload JSON direttamente così come sono (i payload non JSON devono prima essere codificati/decodificati)