

# DynamoDB の式の属性名 (エイリアス)
<a name="Expressions.ExpressionAttributeNames"></a>

式の属性名は、実際の属性名の代わりとして Amazon DynamoDB の式で使用するエイリアス (またはプレースホルダー) です。**式の属性名は、シャープ記号 (`#`) で始める必要があり、1 つ以上の英数字が続きます。アンダースコア (`_`) 文字も使用できます。

このセクションでは、式の属性名を使用する必要があるいくつかの状況について説明します。

**注記**  
このセクションの例では AWS Command Line Interface (AWS CLI) を使用します。

**Topics**
+ [予約語](#Expressions.ExpressionAttributeNames.ReservedWords)
+ [特殊文字を含む属性名](#Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters)
+ [入れ子の属性](#Expressions.ExpressionAttributeNames.NestedAttributes)
+ [属性名を繰り返し参照する](#Expressions.ExpressionAttributeNames.RepeatingAttributeNames)

## 予約語
<a name="Expressions.ExpressionAttributeNames.ReservedWords"></a>

DynamoDB 予約語と競合する属性名を含む式を書く必要が生じることもあります。予約語の一覧については、「[DynamoDB の予約語](ReservedWords.md)」を参照してください。

たとえば、AWS CLI は予約語であるため、次の `COMMENT` の例は失敗します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "Comment"
```

この問題に対処するには、`Comment` を、`#c` などの式の属性名で置き換えることができます。`#`（シャープ記号）は必須であり、これが属性名のプレースホルダーであることを示します。AWS CLI の例は次のようになります。

```
aws dynamodb get-item \
     --table-name ProductCatalog \
     --key '{"Id":{"N":"123"}}' \
     --projection-expression "#c" \
     --expression-attribute-names '{"#c":"Comment"}'
```

**注記**  
属性名が数値で始まるか、スペースまたは予約語を含む場合、式の属性名を使用して式のその属性名を置き換える*必要があります*。

## 特殊文字を含む属性名
<a name="Expressions.ExpressionAttributeNames.AttributeNamesContainingSpecialCharacters"></a>

式では、ドット (".") はドキュメントパスの区切り文字として解釈されます。ただし、DynamoDB では属性名の一部としてドット文字や、ハイフン (「-」) などの特殊文字を使用することもできます。これは、あいまいな意味を持つことがあります。例として、`ProductCatalog` 項目から `Safety.Warning` 属性を取得するとします ([DynamoDB で式を使用する場合の項目属性の参照](Expressions.Attributes.md) を参照してください)。

プロジェクション式を使用して、`Safety.Warning` にアクセスするとします。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "Safety.Warning"
```

DynamoDB は、予想される文字列 ("`Always wear a helmet`") ではなく空の結果を返します。これは、DynamoDB が式のドットをドキュメントパスの区切り文字として解釈するためです。この場合、`#sw` の置換として式の属性名 (`Safety.Warning` など) を定義する必要があります。その後、次のプロジェクション式を使用します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#sw" \
    --expression-attribute-names '{"#sw":"Safety.Warning"}'
```

次に、DynamoDB が正しい結果を返します。

**注記**  
属性名にドット (「.」) またはハイフン (「-」) が含まれている場合は、式の属性名を使用して、式でその属性名を置き換える*必要があります*。

## 入れ子の属性
<a name="Expressions.ExpressionAttributeNames.NestedAttributes"></a>

ネストされた属性 `ProductReviews.OneStar` にアクセスするとします。式の属性名において、DynamoDB はドット (".") を属性名内の文字として扱います。ネストされた属性を参照するには、ドキュメントパス内の要素ごとに式の属性名を定義します。
+ `#pr — ProductReviews`
+ `#1star — OneStar`

その後、プロジェクション式として `#pr.#1star` を使用します。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#pr.#1star"  \
    --expression-attribute-names '{"#pr":"ProductReviews", "#1star":"OneStar"}'
```

次に、DynamoDB が正しい結果を返します。

## 属性名を繰り返し参照する
<a name="Expressions.ExpressionAttributeNames.RepeatingAttributeNames"></a>

式の属性名は、同じ属性名を繰り返し参照する必要がある場合に役立ちます。たとえば、`ProductCatalog` 項目からいくつかの評価を取得する次の式を考えてみます。

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "ProductReviews.FiveStar, ProductReviews.ThreeStar, ProductReviews.OneStar"
```

これをより簡潔にするために、`ProductReviews` を、`#pr` などの式の属性名で置き換えることができます。変更された式は次のようになります。
+  `#pr.FiveStar, #pr.ThreeStar, #pr.OneStar` 

```
aws dynamodb get-item \
    --table-name ProductCatalog \
    --key '{"Id":{"N":"123"}}' \
    --projection-expression "#pr.FiveStar, #pr.ThreeStar, #pr.OneStar" \
    --expression-attribute-names '{"#pr":"ProductReviews"}'
```

式属性名を定義した場合、式全体で一貫して使用する必要があります。さらに、`#` 記号を省略することはできません。