

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 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자까지 가능합니다.
+ 쉼표로 구분된 단일 SET 절에서 여러 변수를 설정할 수 있습니다.
+ 각 변수는 한 번만 할당할 수 있습니다(변수는 변경할 수 없음).
+ SET 키워드는 SQL 문당 한 번만 사용할 수 있습니다.

## 변수 사용
<a name="iot-sql-set-usage"></a>

변수를 정의한 후 다음에서 사용할 수 있습니다.
+ SELECT 절
+ WHERE 절
+ 기타 SET 변수 할당
+ 작업 대체 템플릿
+ 오류 작업 대체 템플릿
+ 중첩된 SELECT 쿼리
+ 함수 파라미터( roleArn 파라미터와 같은 특정 파라미터 및와 유사한 함수 모드를 전환하는 파라미터는 변수를 지원하지 `transform("enrichArray", attributes, values)` 않음)

변수는 `@variable_name` SET 절에 사용된 것과 동일한 구문을 사용하여 참조됩니다. 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 변수가 없으면 디코딩 함수를 세 번 반복해야 하며, 이는 함수 호출 제한을 초과합니다.

**여러 변수**

쉼표로 구분하여 단일 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개의 고유 변수
+ 최대 변수 값 크기 128KiB(최소 UTF-8 JSON 문자열)
+ 모든 변수에 대해 128KiB의 최대 총 값 크기
+ 변수 이름은 64자로 제한됩니다.
+ 변수는 JSON 페이로드를 그대로 직접 수락할 수 있습니다(JSON이 아닌 페이로드를 먼저 인코딩/디코딩해야 함).