

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Cláusula SET
<a name="iot-sql-set"></a>

Utilice la cláusula SET para definir las variables que almacenan los resultados de las expresiones. Puede reutilizar estas variables en las cláusulas SELECT y WHERE y en las plantillas de sustitución. Esto le ayuda a evitar la duplicación de expresiones complejas y a reducir el número de llamadas a funciones en su sentencia SQL.

La cláusula SET admite[Tipos de datos](iot-sql-data-types.md),[Operadores](iot-sql-operators.md),[Funciones](iot-sql-functions.md),[Literales](iot-sql-literals.md), [Instrucciones case](iot-sql-case.md)[Extensiones JSON](iot-sql-json.md), [Variables](#iot-sql-set-usage) y[Consultas de objetos anidados](iot-sql-nested-queries.md).

## Sintaxis de la cláusula SET
<a name="iot-sql-set-syntax"></a>

La cláusula SET debe aparecer antes que la cláusula SELECT en la sentencia SQL. Utilice la siguiente sintaxis:

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

Reglas de sintaxis:
+ Comience los nombres de las variables con `@`
+ Los nombres de las variables pueden contener letras, números y guiones bajos
+ Los nombres de las variables pueden tener hasta 64 caracteres
+ Se pueden establecer varias variables en una sola cláusula SET, separadas por comas
+ Cada variable solo se puede asignar una vez (las variables son inmutables)
+ La palabra clave SET solo se puede usar una vez por sentencia SQL

## Uso de variables
<a name="iot-sql-set-usage"></a>

Después de definir las variables, puede usarlas en:
+ cláusulas SELECT
+ cláusulas WHERE
+ Otras asignaciones de variables SET
+ Plantillas de sustitución de acciones
+ Plantillas de sustitución de acciones de error
+ Consultas SELECT anidadas
+ Parámetros de función (algunos parámetros, como los parámetros de RoLearn y los parámetros que cambian el modo de una función de forma similar, `transform("enrichArray", attributes, values)` no admiten variables)

Se hace referencia a las variables con la misma `@variable_name` sintaxis utilizada en la cláusula SET. También puede usar la sintaxis de la extensión JSON para acceder a las propiedades de las variables que contienen objetos, como`@variable_name.property`.

## Ejemplos de cláusulas SET
<a name="iot-sql-set-examples"></a>

**Uso básico de variables**

El siguiente ejemplo muestra una carga útil publicada sobre el tema: `device/data` `{"temp_fahrenheit": 75, "humidity": 60}`

Instrucción SQL:

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

Carga útil saliente: `{"celsius": 23.89, "humidity": 60}`

**Accede a los miembros en objetos JSON incrustados**

En el siguiente ejemplo, se muestra una carga útil publicada sobre un tema: `device/data` `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

Instrucción 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'
```

Carga útil saliente: `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 para obtener más información sobre cómo trabajar con extensiones JSON, consulte [Extensiones JSON](iot-sql-json.md) 

**Evitar la duplicación de llamadas a funciones**

Las variables SET ayudan a evitar la duplicación de operaciones de decodificación complejas:

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

Sin las variables SET, tendría que repetir la función de decodificación tres veces, lo que supera los límites de llamadas a la función.

**Variables múltiples**

Puede definir varias variables en una sola cláusula SET separándolas con comas:

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

**Uso de variables en plantillas de sustitución**

Las variables también se pueden utilizar en las plantillas de sustitución de acciones, lo que permite reutilizar los valores calculados tanto en las acciones de la sentencia SQL como en las de las reglas.

Instrucción SQL:

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

Configuración de acciones:

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

En este ejemplo, la variable SET `@temp_celsius` se utiliza en una plantilla de sustitución para construir el campo clave de la acción de S3.

**Uso de cargas que no son de JSON**

Las variables SET no admiten directamente cargas útiles que no sean de JSON, por lo que la carga útil debe codificarse o decodificarse primero:

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

 para obtener más información sobre cómo trabajar con cargas útiles que no son de JSON, consulte [Uso de las cargas binarias](binary-payloads.md) 

## LÍMITES DE CLÁUSULAS SET
<a name="iot-sql-set-limits"></a>

Los siguientes límites se aplican a las variables SET:
+ Máximo de 10 variables únicas por sentencia SQL
+ Tamaño máximo de valor variable de 128 KiB (cadena JSON UTF-8 minificada)
+ Tamaño máximo del valor total de 128 KiB para todas las variables
+ Los nombres de las variables están limitados a 64 caracteres
+ Las variables pueden aceptar cargas útiles de JSON directamente tal cual (las cargas que no son de JSON deben codificarse o decodificarse primero)