

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à.

# Ifelse
<a name="ifelse-function"></a>

`ifelse` valuta un set di *se*, gli abbinamenti delle espressioni *poi* e restituisce il valore dell'argomento *poi* per il primo argomento *se* che valuta come true. Se nessuno degli argomenti *se* viene valutato come true, viene restituito il valore dell'argomento *altro*.

## Sintassi
<a name="ifelse-function-syntax"></a>

```
ifelse(if-expression-1, then-expression-1 [, if-expression-n, then-expression-n ...], else-expression)
```

## Arguments (Argomenti)
<a name="ifelse-function-arguments"></a>

`ifelse` richiede uno o più abbinamenti di espressioni *if*,*then* e una espressione per l'argomento *else*. 

 *espressione if*   
L'espressione da valutare come true o meno. Può trattarsi di un nome di campo come **address1**, un valore letterale come **'Unknown'** o un'altra funzione come `toString(salesAmount)`. Un esempio è `isNotNull(FieldName)`.   
Se si utilizzano più operatori AND e OR nell'argomento `if`, racchiudere le istruzioni tra parentesi per individuare l'ordine di elaborazione. Ad esempio, il seguente argomento `if` restituisce record con un mese 1, 2 o 5 e un anno 2000.  

```
ifelse((month = 5 OR month < 3) AND year = 2000, 'yes', 'no')
```
Il successivo argomento `if` utilizza gli stessi operatori, ma restituisce record con un mese 5 e un anno qualsiasi oppure con un mese 1 o 2 e un anno 2000.  

```
ifelse(month = 5 OR (month < 3 AND year = 2000), 'yes', 'no')
```

 *then-expression*   
L'espressione da restituire se il relativo l'argomento *se* viene valutato come true. Può trattarsi di un nome di campo come **address1**, un valore letterale come **'Unknown'** o una chiamata a un'altra funzione. L'espressione deve avere lo stesso tipo di dati degli altri argomenti `then` e dell'argomento `else`. 

 *else-expression*   
L'espressione da restituire se nessuno degli argomenti *se* viene valutato come true. Può trattarsi di un nome di campo come **address1**, un valore letterale come **'Unknown'** o un'altra funzione come `toString(salesAmount)`. L'espressione deve avere lo stesso tipo di dati di tutti gli argomenti `then`. 

## Tipo restituito
<a name="ifelse-function-return-type"></a>

`ifelse` restituisce un valore dello stesso tipo di dati dei valori in *then-expression*. Tutti i dati restituiti da *then* e *else* devono essere dello stesso tipo o essere convertiti nello stesso tipo. 

## Esempi
<a name="ifelse-function-example"></a>

L'esempio seguente genera una colonna di alias per il campo `country`.

```
ifelse(country = "United States", "US", country = "China", "CN", country = "India", "IN", "Others") 
```

In questi casi d'uso che valutano ogni valore di un campo rispetto a un elenco di valori letterali e restituiscono il risultato corrispondente al primo valore corrispondente, si consiglia di utilizzare la funzione switch per semplificare il lavoro. L'esempio precedente può essere riscritto nella seguente dichiarazione utilizzando [https://docs.aws.amazon.com/quicksight/latest/user/switch-function.html](https://docs.aws.amazon.com/quicksight/latest/user/switch-function.html):

```
switch(country,"United States","US","China","CN","India","IN","Others")
```

L'esempio seguente classifica le vendite per cliente in livelli leggibili dall'uomo.

```
ifelse(salesPerCustomer < 1000, “VERY_LOW”, salesPerCustomer < 10000, “LOW”, salesPerCustomer < 100000, “MEDIUM”, “HIGH”)
```

L'esempio seguente utilizza AND, OR e NOT per confrontare più espressioni utilizzando operatori condizionali per applicare tag ai clienti principali NON (NOT) a Washington o in Oregon con una promozione speciale che hanno effettuato più di 10 ordini. Se non viene restituito alcun valore, viene utilizzato il valore `'n/a'`.

```
ifelse(( (NOT (State = 'WA' OR State =  'OR')) AND Orders > 10),  'Special Promotion XYZ',  'n/a')
```

Gli esempi seguenti utilizzano solo OR per generare una nuova colonna che contiene il nome del continente corrispondente a ciascun `country`.

```
ifelse(country = "United States" OR country = "Canada", "North America", country = "China" OR country = "India" OR country = "Japan", "Asia", "Others")
```

L'esempio precedente può essere semplificato come illustrato nell'esempio successivo. L'esempio seguente utilizza `ifelse` e [https://docs.aws.amazon.com/quicksight/latest/user/in-function.html](https://docs.aws.amazon.com/quicksight/latest/user/in-function.html) per creare un valore in una nuova colonna per ogni riga in cui il valore testato si trova in un elenco di letterali. Puoi usare `ifelse` anche con [https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html](https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html).

```
ifelse(in(country,["United States", "Canada"]), "North America", in(country,["China","Japan","India"]),"Asia","Others")
```

Gli autori possono salvare un elenco di letterali in un parametro multi-valore e utilizzarlo nelle funzioni [https://docs.aws.amazon.com/quicksight/latest/user/in-function.html](https://docs.aws.amazon.com/quicksight/latest/user/in-function.html) o [https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html](https://docs.aws.amazon.com/quicksight/latest/user/notIn-function.html). L'esempio seguente è un equivalente dell'esempio precedente, tranne per il fatto che gli elenchi di letterali sono memorizzati in due parametri multi-valore. 

```
ifelse(in(country,${NorthAmericaCountryParam}), "North America", in(country,${AsiaCountryParam}),"Asia", "Others") 
```

L'esempio seguente assegna un gruppo a un record delle vendite basato sul totale delle vendite. La struttura di ogni frase `if-then` imita il comportamento dell'operatore *tra*, una parola chiave che attualmente non funziona nelle espressioni di campi calcolati. Ad esempio, il risultato del confronto `salesTotal >= 0 AND salesTotal < 500` restituisce gli stessi valori del confronto `salesTotal between 0 and 499` SQL.

```
ifelse(salesTotal >= 0 AND salesTotal < 500, 'Group 1', salesTotal >= 500 AND salesTotal < 1000, 'Group 2', 'Group 3')
```

L'esempio seguente verifica la presenza di un valore NULL utilizzando `coalesce` per restituire il primo valore non NULL. Invece di dover ricordare il significato di un valore NULL in un campo di data, è possibile utilizzare una descrizione leggibile. Se la data di disconnessione è NULL, l'esempio restituisce la data di sospensione, a meno che entrambe non siano NULL. Quindi `coalesce(DiscoDate, SuspendDate, '12/31/2491')` restituisce `'12/31/2491'`. Il valore restituito deve corrispondere agli altri tipi di dati. Questa data potrebbe sembrare un valore insolito, ma una data del 25° secolo simula ragionevolmente la "fine dei tempi", definita come la data più alta in un data mart. 

```
ifelse (  (coalesce(DiscoDate, SuspendDate, '12/31/2491') = '12/31/2491'),  'Active subscriber', 'Inactive subscriber')
```

Di seguito viene illustrato un esempio più complesso in un formato più leggibile, solo per dimostrare che non è necessario comprimere tutto il codice in un'unica lunga riga. Questo esempio fornisce confronti multipli del valore di un risultato dell'indagine. Gestisce i potenziali valori NULL per questo campo e classifica due intervalli accettabili. Inoltre etichetta un intervallo che richiede più test e un altro non valido (fuori intervallo). Per tutti i valori rimanenti, applica la condizione `else` ed etichetta la riga come se fosse necessario ripetere il test tre anni dopo la data in quella riga. 

```
ifelse
( 
    isNull({SurveyResult}), 'Untested',  
    {SurveyResult}=1, 'Range 1', 
    {SurveyResult}=2, 'Range 2', 
    {SurveyResult}=3, 'Need more testing',
    {SurveyResult}=99, 'Out of Range',
    concat  
    (
        'Retest by ', 
        toString    
        (
           addDateTime(3, "YYYY", {Date}) 
        )
    )
)
```

L'esempio seguente assegna un nome di regione creato "manualmente" a un gruppo di stati. Utilizza inoltre spaziatura e commenti, integrati `/* */`, per semplificare la manutenzione del codice. 

```
ifelse 
(    /* NE REGION*/
     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
    'Northeast',

     /* SE REGION*/
     locate('Georgia, Alabama, South Carolina, Louisiana',{State}) > 0,
    'Southeast',

    'Other Region'
)
```

La logica per l'etichettatura delle regioni si suddivide come segue:

1. Elenchiamo gli stati che vogliamo per ogni regione, racchiudendo ogni elenco tra virgolette per trasformare ogni elenco in una stringa, come riportato di seguito: 
   + `'New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire'`
   + `'Georgia, Alabama, South Carolina, Louisiana'`
   + Puoi aggiungere altri set o utilizzare paesi, città, province o What3Words, se lo desideri. 

1. Chiediamo se il valore per `State` (per ogni riga) si trova nell'elenco, utilizzando la funzione `locate` per restituire un valore diverso da zero se lo stato si trova nell'elenco, come riportato di seguito.

   ```
   locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) 
   
   and
   
   locate('Georgia, Alabama, South Carolina, Louisiana',{State})
   ```

1. La funzione `locate` restituisce un numero anziché un `TRUE` o `FALSE`, ma `ifelse` richiede il valore booleano `TRUE`/`FALSE`. Per ovviare a questo problema, possiamo confrontare il risultato di `locate` con un numero. Se lo stato è presente nell'elenco, il valore restituito è maggiore di zero.

   1. Chiedi se lo stato è presente.

      ```
      locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0
      ```

   1. Se è presente la regione, etichettala come regione specifica, in questo caso regione nord-orientale.

      ```
      /*The if expression:*/     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
      /*The then expression:*/   'Northeast',
      ```

1. Poiché abbiamo stati che non sono in un elenco e poiché `ifelse` richiede una singola espressione `else`, forniamo `'Other Region'` come etichetta per gli stati rimanenti. 

   ```
   /*The if expression:*/     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
   /*The then expression:*/   'Northeast',
   /*The else expression:*/   'Other Region'
   ```

1. Tutto questo lo racchiudiamo nella funzione `ifelse( )` per ottenere la versione finale. L'esempio seguente esclude gli stati della regione sud-orientale presenti nell'originale. Puoi aggiungerli nuovamente al posto del tag *`<insert more regions here>`*. 

   Se desideri aggiungere altre regioni, puoi creare più copie di queste due righe e modificare l'elenco degli stati in base alle tue esigenze. Puoi cambiare il nome della regione in base alle tue esigenze e cambiare il nome del campo da `State` in qualsiasi cosa ti serva. 

   ```
   ifelse 
   (
   /*The if expression:*/     locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) > 0,
   /*The then expression:*/   'Northeast',
   
   /*<insert more regions here>*/
   
   /*The else expression:*/   'Other Region'
   )
   ```
**Nota**  
Esistono altri modi per eseguire il confronto iniziale per l'espressione if. Ad esempio, supponiamo di porre la domanda "Quali stati non mancano in questo elenco?" anziché "Quali stati sono presenti nell'elenco?" Se lo fai, potresti formularla in modo diverso. È possibile confrontare l'istruzione locate con zero per trovare i valori mancanti nell'elenco e quindi utilizzare l'operatore NOT per classificarli come "non mancanti", come riportato di seguito.  

   ```
   /*The if expression:*/      NOT (locate('New York, New Jersey, Connecticut, Vermont, Maine, Rhode Island, New Hampshire',{State}) = 0),
   ```
Entrambe le versioni sono corrette. La versione che scegli dovrebbe avere più senso per te e per il tuo team, in modo da poterla gestire facilmente. Se tutte le opzioni sembrano uguali, scegli la più semplice.