

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Scrittura di condizioni con parametri legacy
<a name="LegacyConditionalParameters.Conditions"></a>

**Nota**  
Consigliamo di utilizzare i nuovi parametri di espressione piuttosto che i parametri precedenti, se possibile. Per ulteriori informazioni, consulta [Utilizzo di espressioni in DynamoDB](Expressions.md).

Nella sezione seguente viene descritto come scrivere le condizioni da utilizzare con i parametri legacy, ad esempio `Expected`, `QueryFilter` e `ScanFilter`.

**Nota**  
Le nuove applicazioni dovrebbero invece utilizzare i parametri di espressione. Per ulteriori informazioni, consulta [Utilizzo di espressioni in DynamoDB](Expressions.md).

## Condizioni semplici
<a name="LegacyConditionalParameters.Simple"></a>

Con i valori degli attributi, è possibile scrivere condizioni per i confronti rispetto agli attributi della tabella. Una condizione restituisce sempre true o false ed è costituita da:
+ `ComparisonOperator`: maggiore di, minore di, uguale a e così via.
+ `AttributeValueList` (facoltativo): i valori degli attributi da confrontare. A seconda di `ComparisonOperator` utilizzato, `AttributeValueList` potrebbe contenere uno, due o più valori; o potrebbe non essere affatto presente.

Nelle sezioni seguenti sono descritti i vari operatori di confronto e sono riportati gli esempi di come utilizzarli nelle condizioni.

### Operatori di confronto senza valori di attributo
<a name="LegacyConditionalParameters.Conditions.Simple.NoAttributeValues"></a>
+ `NOT_NULL`: true se esiste un attributo.
+ `NULL`: true se non esiste un attributo.

Utilizza questi operatori per verificare se un attributo esiste o non esiste. Poiché non vi è alcun valore da confrontare, non specificare `AttributeValueList`.

**Esempio**

La seguente espressione restituisce true se l'attributo *Dimensions* esiste.

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

### Operatori di confronto con un valore di attributo
<a name="LegacyConditionalParameters.Conditions.Simple.OneAttributeValue"></a>
+ `EQ`: true se un attributo è uguale a un valore.

  `AttributeValueList` può contenere solo un valore di tipo String, Number, Binary, String Set, Number Set o Binary Set. Se un elemento contiene un valore di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde. Ad esempio, la stringa `"3"` non è uguale al numero `3`. Inoltre, il numero `3` non è uguale al set di numeri `[3, 2, 1]`. 
+ `NE`: true se un attributo non è uguale a un valore.

  `AttributeValueList` può contenere solo un valore di tipo String, Number, Binary, String Set, Number Set o Binary Set. Se un elemento contiene un valore di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde.
+ `LE`: true se un attributo è minore o uguale a un valore.

  `AttributeValueList` può contenere solo un valore di tipo String, Number o Binary (non un tipo Set). Se un elemento contiene un `AttributeValue` di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde.
+ `LT`: true se un attributo è minore di un valore.

  `AttributeValueList` può contenere solo un valore di tipo String, Number o Binary (non un tipo Set). Se un elemento contiene un valore di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde.
+ `GE`: true se un attributo è maggiore o uguale a un valore.

  `AttributeValueList` può contenere solo un valore di tipo String, Number o Binary (non un tipo Set). Se un elemento contiene un valore di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde.
+ `GT`: true se un attributo è maggiore di un valore.

  `AttributeValueList` può contenere solo un valore di tipo String, Number o Binary (non un tipo Set). Se un elemento contiene un valore di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde.
+ `CONTAINS`: true se un valore è presente all'interno di un set o se un valore ne contiene un altro.

  `AttributeValueList` può contenere solo un valore di tipo String, Number o Binary (non un tipo Set). Se l'attributo di destinazione del confronto è di tipo String, l'operatore controlla la presenza di una corrispondenza di sottostringa. Se l'attributo di destinazione del confronto è di tipo Binary, l'operatore cerca una sottosequenza della destinazione che corrisponde all'input. Se l'attributo di destinazione del confronto è di tipo Set, l'operatore restituisce true se trova una corrispondenza esatta con qualsiasi membro del set.
+ `NOT_CONTAINS`: true se un valore *non* è presente all'interno di un set o se un valore ne contiene un altro.

  `AttributeValueList` può contenere solo un valore di tipo String, Number o Binary (non un tipo Set). Se l'attributo di destinazione del confronto è String, l'operatore verifica l'assenza di una corrispondenza di sottostringa. Se l'attributo di destinazione del confronto è Binary, l'operatore verifica l'assenza di una sottosequenza della destinazione che corrisponde all'input. Se l'attributo di destinazione del confronto è di tipo Set, l'operatore restituisce true se *non* trova una corrispondenza esatta con qualsiasi membro del set.
+ `BEGINS_WITH`: true se i primi caratteri di un attributo corrispondono al valore fornito. Non utilizzare questo operatore per confrontare i numeri.

  `AttributeValueList` può contenere solo un valore di tipo String o Binary (non un tipo Number o Set). L'attributo di destinazione del confronto deve essere String o Binary (non Number o un set).

Utilizza questi operatori per confrontare un attributo con un valore. È necessario specificare un `AttributeValueList` costituito da un valore singolo. Per la maggior parte degli operatori, questo valore deve essere uno scalare; tuttavia, gli operatori `EQ` e `NE` supportano anche i set.

**Esempi**

Le seguenti espressioni restituiscono true se: 
+ Il prezzo di un prodotto è maggiore di 100.

  ```
  ...
      "Price": {
          ComparisonOperator: "GT",
          AttributeValueList: [ {"N":"100"} ]
      }
  ...
  ```
+ Una categoria di prodotti inizia con "Bo".

  ```
  ...
      "ProductCategory": {
          ComparisonOperator: "BEGINS_WITH",
          AttributeValueList: [ {"S":"Bo"} ]
      }
  ...
  ```
+ Un prodotto è disponibile in rosso, verde o nero:

  ```
  ...
      "Color": {
          ComparisonOperator: "EQ",
          AttributeValueList: [
              [ {"S":"Black"}, {"S":"Red"}, {"S":"Green"} ]
          ]
      }
  ...
  ```
**Nota**  
Quando si confrontano i tipi di dati Set, l'ordine degli elementi non ha importanza. DynamoDB restituirà solo gli elementi con lo stesso set di valori, indipendentemente dall'ordine in cui vengono specificati nella richiesta.

### Operatori di confronto con due valori di attributo
<a name="LegacyConditionalParameters.Conditions.Simple.TwoAttributeValues"></a>
+ `BETWEEN`: true se un valore è compreso tra un limite inferiore e un limite superiore, endpoint inclusi.

  `AttributeValueList` deve contenere due elementi dello stesso tipo, String, Number o Binary (non un tipo Set). Un attributo di destinazione corrisponde se il valore di destinazione è maggiore o uguale al primo elemento e minore o uguale al secondo elemento. Se un elemento contiene un valore di un tipo diverso da quello specificato nella richiesta, il valore non corrisponde.

Utilizza questo operatore per determinare se un valore di attributo è compreso in un intervallo. `AttributeValueList` deve contenere due elementi scalari dello stesso tipo: String, Number o Binary.

 **Esempio**

L'espressione seguente restituisce true se il prezzo di un prodotto è compreso tra 100 e 200.

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

### Operatori di confronto con *N* valori di attributo
<a name="LegacyConditionalParameters.Conditions.Simple.NAttributeValues"></a>
+ `IN`: true se un valore è uguale a uno qualsiasi dei valori in un elenco enumerato. Nell'elenco sono supportati solo i valori scalari, non i set. Per corrispondere, l'attributo di destinazione deve essere dello stesso tipo e valore esatto.

  `AttributeValueList` può contenere uno o più elementi di tipo String, Number o Binary (non un tipo Set). Questi attributi vengono confrontati con un attributo di tipo non Set esistente di un elemento. Se nell'attributo dell'elemento è presente *qualsiasi* elemento del set di input, l'espressione restituisce true.

  `AttributeValueList` può contenere uno o più valori di tipo String, Number o Binary (non un tipo Set). Per corrispondere, l'attributo di destinazione del confronto deve essere dello stesso tipo e valore esatto. Una valore stringa non corrisponde mai a un set di stringhe.

Utilizza questo operatore per determinare se il valore fornito è incluso in un elenco numerato. È possibile specificare un numero qualsiasi di valori scalari in `AttributeValueList`, ma devono essere tutti dello stesso tipo di dati.

 **Esempio**

L'espressione seguente restituisce true se il valore per *Id* è 201, 203 o 205.

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

## Utilizzo di più condizioni
<a name="LegacyConditionalParameters.Conditions.Multiple"></a>

DynamoDB consente di combinare più condizioni per formare espressioni complesse. Questa operazione viene eseguita fornendo almeno due espressioni, con un [ConditionalOperator (eredità)](LegacyConditionalParameters.ConditionalOperator.md) facoltativo.

Per impostazione predefinita, quando si specifica più di una condizione, *tutte* le condizioni devono restituire true affinché l'intera espressione restituisca true. In altre parole, si verifica un'operazione *AND* implicita.

 **Esempio**

L'espressione seguente restituisce true se un prodotto è un libro che ha almeno 600 pagine. Entrambe le condizioni devono restituire true, poiché sono implicitamente collegate con un operatore *AND*.

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

È possibile utilizzare [ConditionalOperator (eredità)](LegacyConditionalParameters.ConditionalOperator.md) per chiarire che avrà luogo un'operazione *AND*. L'esempio seguente si comporta allo stesso modo del precedente.

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

È possibile impostare `ConditionalOperator` anche su *OR*, il che significa che *almeno una* delle condizioni deve restituire true.

 **Esempio**

 La seguente espressione restituisce true se un prodotto è una mountain bike, se si tratta di un marchio particolare o se il suo prezzo è maggiore di 100.

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

**Nota**  
In un'espressione complessa, le condizioni vengono elaborate in ordine, dalla prima all'ultima condizione.  
Non è possibile utilizzare sia AND che OR in una singola espressione.

## Altri operatori condizionali
<a name="LegacyConditionalParameters.Conditions.Other"></a>

Nelle versioni precedenti di DynamoDB, il parametro `Expected` si comportava in modo diverso per le scritture condizionali. Ogni elemento nella mappa `Expected` rappresentava un nome di attributo per il controllo di DynamoDB, insieme a quanto segue:
+ `Value`: un valore da confrontare con l'attributo.
+ `Exists`: determina se il valore esiste prima di provare l'operazione.

Le opzioni `Value` e `Exists` continuano a essere supportate in DynamoDB; tuttavia, consentono solo di verificare una condizione di uguaglianza o se esiste un attributo. Consigliamo di utilizzare invece `ComparisonOperator` e `AttributeValueList`, perché queste opzioni consentono di costruire una gamma molto più ampia di condizioni.

**Example**  
`DeleteItem` può verificare se un libro non è più in pubblicazione ed eliminarlo solo se questa condizione è true. Ecco un esempio AWS CLI che utilizza una condizione legacy:  

```
aws dynamodb delete-item \
    --table-name ProductCatalog \
    --key '{
        "Id": {"N":"600"}
    }' \
    --expected '{
        "InPublication": { 
            "Exists": true, 
            "Value": {"BOOL":false} 
        } 
    }'
```
L'esempio seguente fa la stessa cosa, ma non usa una condizione legacy:  

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

**Example**  
Una operazione `PutItem` può proteggere dalla sovrascrittura di un elemento esistente con gli stessi attributi della chiave primaria. Ecco un esempio che utilizza una condizione legacy:  

```
aws dynamodb put-item \
    --table-name ProductCatalog \
    --item '{
      "Id": {"N":"500"},
        "Title": {"S":"Book 500 Title"}
    }' \
    --expected '{
        "Id": { "Exists": false } 
    }'
```
L'esempio seguente fa la stessa cosa, ma non usa una condizione legacy:  

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

**Nota**  
Per le condizioni nella mappa `Expected`, non utilizzare le opzioni `Value` e `Exists` legacy insieme a `ComparisonOperator` e `AttributeValueList`. Se si utilizzano, la scrittura condizionale non avrà esito positivo.