

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

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

Gunakan klausa SET untuk menentukan variabel yang menyimpan hasil ekspresi. Anda dapat menggunakan kembali variabel-variabel ini dalam klausa SELECT dan WHERE, dan dalam template substitusi. Ini membantu Anda menghindari duplikasi ekspresi kompleks dan mengurangi jumlah panggilan fungsi dalam pernyataan SQL Anda.

Klausa SET mendukung[Jenis Data](iot-sql-data-types.md),[Operator](iot-sql-operators.md),,[Fungsi](iot-sql-functions.md), [Literal](iot-sql-literals.md)[Pernyataan kasus](iot-sql-case.md), [Variabel [Ekstensi JSON](iot-sql-json.md)](#iot-sql-set-usage), dan[Kueri objek bersarang](iot-sql-nested-queries.md).

## SET sintaks klausa
<a name="iot-sql-set-syntax"></a>

Klausa SET harus muncul sebelum klausa SELECT dalam pernyataan SQL Anda. Gunakan sintaks berikut:

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

Aturan sintaks:
+ Mulai nama variabel dengan `@`
+ Nama variabel dapat berisi huruf, angka, dan garis bawah
+ Nama variabel bisa mencapai 64 karakter
+ Beberapa variabel dapat diatur dalam satu klausa SET, dipisahkan dengan koma
+ Setiap variabel hanya dapat ditetapkan sekali (variabel tidak dapat diubah)
+ Kata kunci SET hanya dapat digunakan sekali per pernyataan SQL

## Menggunakan variabel
<a name="iot-sql-set-usage"></a>

Setelah Anda menentukan variabel, Anda dapat menggunakannya di:
+ Klausul SELECT
+ Klausul WHERE
+ Penugasan variabel SET lainnya
+ Templat substitusi tindakan
+ Templat substitusi tindakan kesalahan
+ Kueri SELECT bersarang
+ Parameter fungsi (parameter tertentu seperti parameter RoLearn dan parameter yang mengubah mode fungsi yang mirip dengan `transform("enrichArray", attributes, values)` tidak mendukung variabel)

Variabel direferensikan menggunakan `@variable_name` sintaks yang sama yang digunakan dalam klausa SET. Anda juga dapat menggunakan sintaks ekstensi JSON untuk mengakses properti variabel yang berisi objek, seperti. `@variable_name.property`

## Contoh klausa SET
<a name="iot-sql-set-examples"></a>

**Penggunaan variabel dasar**

Contoh berikut menunjukkan payload yang dipublikasikan pada topik`device/data`: `{"temp_fahrenheit": 75, "humidity": 60}`

Pernyataan SQL:

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

Muatan keluar: `{"celsius": 23.89, "humidity": 60}`

**Akses anggota dalam objek JSON yang disematkan**

Contoh berikut menunjukkan payload yang dipublikasikan pada topik`device/data`: `{"device1": {"deviceId":"weather_sensor", "deviceData": {"sensors": {"temp_fahrenheit": 75, "humidity": 60}, "location": [47.606,-122.332]}}}`

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

Muatan keluar: `{"temp_fahrenheit":75,"humidity":60,"deviceId":"weather_sensor"}`

 untuk informasi lebih lanjut tentang cara bekerja dengan ekstensi JSON, referensi [Ekstensi JSON](iot-sql-json.md) 

**Menghindari panggilan fungsi duplikat**

Variabel SET membantu menghindari duplikasi operasi decode yang kompleks:

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

Tanpa variabel SET, Anda perlu mengulang fungsi decode tiga kali, yang melebihi batas panggilan fungsi.

**Beberapa variabel**

Anda dapat menentukan beberapa variabel dalam satu klausa SET dengan memisahkannya dengan koma:

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

**Menggunakan variabel dalam template substitusi**

Variabel juga dapat digunakan dalam template substitusi tindakan, memungkinkan Anda untuk menggunakan kembali nilai yang dihitung di kedua pernyataan SQL dan tindakan aturan.

Pernyataan SQL:

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

Konfigurasi tindakan:

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

Dalam contoh ini, variabel SET `@temp_celsius` digunakan dalam template substitusi untuk membangun bidang kunci dari tindakan S3.

**Penggunaan muatan non-JSON**

Variabel SET tidak mendukung muatan non-JSON secara langsung, jadi payload harus dikodekan atau didekodekan terlebih dahulu:

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

 untuk informasi lebih lanjut tentang cara bekerja dengan muatan non-JSON, referensi [Bekerja dengan muatan biner](binary-payloads.md) 

## Batas klausa SET
<a name="iot-sql-set-limits"></a>

Batasan berikut berlaku untuk variabel SET:
+ Maksimum 10 variabel unik per pernyataan SQL
+ Ukuran nilai variabel maksimum 128 KiB (diperkecil UTF-8 JSON string)
+ Ukuran nilai total maksimum 128 KiB untuk semua variabel
+ Nama variabel terbatas pada 64 karakter
+ Variabel dapat menerima muatan JSON secara langsung apa adanya (muatan non-JSON harus terlebih dahulu dikodekan/diterjemahkan)