

# Criar condições com parâmetros herdados
<a name="LegacyConditionalParameters.Conditions"></a>

**nota**  
Sugerimos que você use os novos parâmetros de expressão, em vez desses parâmetros herdados. Para obter mais informações, consulte [Usar expressões no DynamoDB](Expressions.md).

A seção a seguir descreve como criar condições a serem usadas com parâmetros herdados, como `Expected`, `QueryFilter` e `ScanFilter`.

**nota**  
Em vez disso, as novas aplicações devem usar parâmetros de expressão. Para obter mais informações, consulte [Usar expressões no DynamoDB](Expressions.md).

## Condições simples
<a name="LegacyConditionalParameters.Simple"></a>

Com valores de atributo, você pode escrever condições para comparações com atributos da tabela. Uma condição sempre é avaliada como verdadeira ou falsa, e consiste em:
+ `ComparisonOperator` - maior que, menor que, igual a e assim por diante.
+ `AttributeValueList` (opcional): valores de atributo para comparar. Dependendo do `ComparisonOperator` que está sendo usado, `AttributeValueList` pode conter um, dois ou mais valores ou pode não estar presente.

As seções a seguir descrevem os vários operadores de comparação, juntamente com exemplos de como usá-los em condições.

### Operadores de comparação sem valores de atributo
<a name="LegacyConditionalParameters.Conditions.Simple.NoAttributeValues"></a>
+ `NOT_NULL` - verdadeiro se um atributo existir.
+ `NULL` - verdadeiro se um atributo não existir.

Use esses operadores para verificar se um atributo existe ou não. Como não há valor de comparação, não especifique `AttributeValueList`.

**Exemplo**

A expressão a seguir é avaliada como verdadeira se o atributo *Dimensions* existir.

```
...
    "Dimensions": {
         ComparisonOperator: "NOT_NULL"
    }
...
```

### Operadores de comparação com um valor de atributo
<a name="LegacyConditionalParameters.Conditions.Simple.OneAttributeValue"></a>
+ `EQ` - verdadeiro se um atributo for igual a um valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number, Binary, String Set, Number Set ou Binary Set. Se um item contém um valor de um tipo diferente do especificado na solicitação, os valores não coincidem. Por exemplo, a string `"3"` não é igual ao número `3`. Além disso, o número `3` não é igual ao conjunto de números `[3, 2, 1]`. 
+ `NE` - verdadeiro se um atributo não for igual a um valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number, Binary, String Set, Number Set ou Binary Set. Se um item contém um valor de um tipo diferente do especificado na solicitação, os valores não coincidem.
+ `LE` - verdadeiro se um atributo for menor ou igual a um valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number ou Binary (não um tipo Set). Se um item contém um `AttributeValue` de um valor diferente do especificado na solicitação, os valores não coincidem.
+ `LT` - verdadeiro se um atributo for menor que um valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number ou Binary (não um tipo Set). Se um item contém um valor de um tipo diferente do especificado na solicitação, os valores não coincidem.
+ `GE` - verdadeiro se um atributo for maior ou igual a um valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number ou Binary (não um tipo Set). Se um item contém um valor de um tipo diferente do especificado na solicitação, os valores não coincidem.
+ `GT` - verdadeiro se um atributo é maior que um valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number ou Binary (não um tipo Set). Se um item contém um valor de um tipo diferente do especificado na solicitação, os valores não coincidem.
+ `CONTAINS` - verdadeiro se um valor estiver presente em um conjunto ou se um valor contiver outro.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number ou Binary (não um tipo Set). Se o atributo de destino da comparação for String, o operador procurará uma substring correspondente. Se o atributo de destino da comparação for Binary, o operador procurará uma subsequência do destino que corresponda à entrada. Se o atributo de destino da comparação for um conjunto, o operador será avaliado como verdadeiro caso encontre uma correspondência exata com qualquer membro do conjunto.
+ `NOT_CONTAINS` - verdadeiro se um valor *não* estiver presente em um conjunto, ou se um valor não contiver outro valor.

  `AttributeValueList` pode conter apenas um valor do tipo String, Number ou Binary (não um tipo Set). Se o atributo de destino da comparação for String, o operador verificará a ausência de uma substring correspondente. Se o atributo de destino da comparação for Binary, o operador verificará a ausência de uma subsequência do destino que corresponda à entrada. Se o atributo de destino da comparação for um conjunto, o operador será avaliado como verdadeiro se ele *não* encontrar uma correspondência exata com qualquer membro do conjunto.
+ `BEGINS_WITH`: verdadeiro se os primeiros caracteres de um atributo corresponderem ao valor fornecido. Não use este operador para comparar números.

  `AttributeValueList` pode conter apenas um valor do tipo String ou Binary (não um tipo Number ou Set). O atributo de destino da comparação deve ser String ou Binary (não Number ou um conjunto).

Use esses operadores para comparar um atributo com um valor. Você deve especificar um `AttributeValueList` consistindo em um único valor. Para a maioria dos operadores, esse valor deve ser escalar. No entanto, os operadores `EQ` e `NE` também dão suporte a conjuntos.

**Exemplos**

As expressões a seguir serão avaliadas como verdadeiras se: 
+ O preço de um produto for maior que 100.

  ```
  ...
      "Price": {
          ComparisonOperator: "GT",
          AttributeValueList: [ {"N":"100"} ]
      }
  ...
  ```
+ A categoria de um produto começar com "Bo".

  ```
  ...
      "ProductCategory": {
          ComparisonOperator: "BEGINS_WITH",
          AttributeValueList: [ {"S":"Bo"} ]
      }
  ...
  ```
+ Um produto estiver disponível em vermelho, verde ou preto:

  ```
  ...
      "Color": {
          ComparisonOperator: "EQ",
          AttributeValueList: [
              [ {"S":"Black"}, {"S":"Red"}, {"S":"Green"} ]
          ]
      }
  ...
  ```
**nota**  
Ao comparar tipos de dados Set, a ordem dos elementos não importa. O DynamoDB retornará apenas os itens com o mesmo conjunto de valores, independentemente da ordem em que você especificá-los em sua solicitação.

### Operadores de comparação com dois valores de atributo
<a name="LegacyConditionalParameters.Conditions.Simple.TwoAttributeValues"></a>
+ `BETWEEN` - verdadeiro se um valor for entre um limite inferior e um limite superior, inclusive endpoints.

  `AttributeValueList` deve conter dois elementos do mesmo tipo, seja String, Number ou Binary (não Set). Um atributo de destino corresponderá se o valor de destino for maior que ou igual ao primeiro elemento e menor que ou igual ao segundo elemento. Se um item contém um valor de um tipo diferente do especificado na solicitação, os valores não coincidem.

Use este operador para determinar se um valor de atributo está dentro de um intervalo. A `AttributeValueList` deve conter dois elementos escalares do mesmo tipo – String, Number ou Binary.

 **Exemplo**

A expressão a seguir será avaliada como verdadeira, se o preço de um produto estiver entre 100 e 200.

```
...
    "Price": {
        ComparisonOperator: "BETWEEN",
        AttributeValueList: [ {"N":"100"}, {"N":"200"} ]
    }
...
```

### Operadores de comparação com *n* valores de atributo
<a name="LegacyConditionalParameters.Conditions.Simple.NAttributeValues"></a>
+ `IN`: verdadeiro se um valor for igual a qualquer um dos valores em uma lista enumerada. Somente valores escalares são aceitos na lista, mas não conjuntos. O atributo de destino deve ser do mesmo tipo e o valor exato para corresponder.

  `AttributeValueList` pode conter um ou mais elementos do tipo String, Number ou Binary (não um tipo Set). Esses atributos são comparados com um atributo do tipo que não é Set existente de um item. Se *quaisquer* elementos do conjunto de entradas estiverem presentes no atributo do item, a expressão será avaliada como verdadeira.

  `AttributeValueList` pode conter um ou mais valores do tipo String, Number ou Binary (não um tipo Set). O atributo de destino da comparação deve ser do mesmo tipo e ter o valor exato para corresponder. Um atributo String nunca corresponde a um String set.

Use este operador para determinar se o valor fornecido está em uma lista enumerada. Você pode especificar qualquer número de valores escalares em `AttributeValueList`, mas todos eles devem ser do mesmo tipo de dados.

 **Exemplo**

A expressão a seguir será avaliada como verdadeira se o valor para *Id* for 201, 203 ou 205.

```
...
    "Id": {
        ComparisonOperator: "IN",
        AttributeValueList: [ {"N":"201"}, {"N":"203"}, {"N":"205"} ]
    }
...
```

## Uso de várias condições
<a name="LegacyConditionalParameters.Conditions.Multiple"></a>

O DynamoDB permite combinar várias condições para formar expressões complexas. Isso é feito ao fornecer pelo menos duas expressões, com um opcional [ConditionalOperator (herdado)](LegacyConditionalParameters.ConditionalOperator.md).

Por padrão, quando você especifica mais de uma condição, *todas* as condições devem ser avaliadas como verdadeiras para que a expressão inteira também seja avaliada assim. Em outras palavras, uma operação *AND* implícita acontece.

 **Exemplo**

A expressão a seguir será avaliada como verdadeira se um produto for um livro que tem 600 páginas, pelo menos. Ambas as condições devem ser avaliadas como verdadeiras, já que elas são implicitamente *AND*ed (associadas).

```
... 
    "ProductCategory": { 
        ComparisonOperator: "EQ",
        AttributeValueList: [ {"S":"Book"} ]
    },
    "PageCount": { 
        ComparisonOperator: "GE",
        AttributeValueList: [ {"N":600"} ]
    }
...
```

Você pode usar [ConditionalOperator (herdado)](LegacyConditionalParameters.ConditionalOperator.md) para esclarecer que uma operação *AND* acontecerá. O exemplo a seguir se comporta da mesma forma que o anterior.

```
...   
    "ConditionalOperator" : "AND",
    "ProductCategory": { 
        "ComparisonOperator": "EQ",
        "AttributeValueList": [ {"N":"Book"} ]
    },
    "PageCount": { 
        "ComparisonOperator": "GE",
        "AttributeValueList": [ {"N":600"} ]
    }
...
```

Você também pode definir `ConditionalOperator` como *OR*, o que significa que *pelo menos uma* das condições deve ser avaliada como verdadeira.

 **Exemplo**

 A expressão a seguir será avaliada como verdadeira, se um produto for uma mountain bike, se ele for de uma marca específica ou se o preço for maior que 100.

```
... 
    ConditionalOperator : "OR",
    "BicycleType": { 
        "ComparisonOperator": "EQ",
        "AttributeValueList": [ {"S":"Mountain" ]
    },
    "Brand": { 
        "ComparisonOperator": "EQ",
        "AttributeValueList": [ {"S":"Brand-Company A" ]
    },
    "Price": { 
        "ComparisonOperator": "GT",
        "AttributeValueList": [ {"N":"100"} ]
    }
...
```

**nota**  
Em uma expressão complexa, as condições são processadas na ordem, da primeira condição para a última.  
Não é possível usar AND e OR em uma única expressão.

## Outros operadores condicionais
<a name="LegacyConditionalParameters.Conditions.Other"></a>

Em versões anteriores do DynamoDB, o parâmetro `Expected` se comportava de forma diferente em gravações condicionais. Cada item no mapa `Expected` representava um nome de atributo para o DynamoDB verificar, juntamente com o seguinte:
+ `Value` - um valor para comparar com o atributo.
+ `Exists` - determina se o valor existe antes de tentar a operação.

As opções `Value` e `Exists` continuam a ter suporte no DynamoDB; no entanto, elas só permitem que você teste uma condição de igualdade ou se um atributo existe. Recomendamos que você use `ComparisonOperator` e `AttributeValueList` em vez disso, pois essas opções permitem que você crie uma gama muito maior de condições.

**Example**  
Uma operação `DeleteItem` pode verificar se um livro não está mais em publicação e excluí-lo somente se essa condição for verdadeira. Veja um exemplo da AWS CLI que usa uma condição herdada:  

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{
        "Id": {"N":"600"}
    }' \
    --expected '{
        "InPublication": { 
            "Exists": true, 
            "Value": {"BOOL":false} 
        } 
    }'
```
O exemplo a seguir executa a mesma ação, mas não usa uma condição herdada:  

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{
        "Id": {"N":"600"}
    }' \
    --expected '{
        "InPublication": { 
            "ComparisonOperator": "EQ", 
            "AttributeValueList": [ {"BOOL":false} ]
        } 
    }'
```

**Example**  
Uma operação `PutItem` pode proteger contra a substituição de um item existente com os mesmos atributos da chave primária. Veja um exemplo que usa uma condição herdada:  

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item '{
      "Id": {"N":"500"},
        "Title": {"S":"Book 500 Title"}
    }' \
    --expected '{
        "Id": { "Exists": false } 
    }'
```
O exemplo a seguir executa a mesma ação, mas não usa uma condição herdada:  

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item '{
      "Id": {"N":"500"},
        "Title": {"S":"Book 500 Title"}
    }' \
    --expected '{
        "Id": { "ComparisonOperator": "NULL" } 
    }'
```

**nota**  
Para condições no mapa `Expected`, não use as opções herdadas `Value` e `Exists` com `ComparisonOperator` e `AttributeValueList`. Se você fizer isso, sua gravação condicional falhará.