Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
Un valore è un dato prodotto dalla valutazione di un'espressione. In questa sezione vengono descritti i tipi di valori disponibili nel linguaggio M. Ogni tipo di valore è associato a una sintassi letterale, a un set di valori dello stesso tipo, a un set di operatori definiti per il set di valori e a un tipo intrinseco attribuito ai valori appena creati.
Tipologia | Letterale |
---|---|
Null | null |
Logico | true false |
Numero | 0 1 -1 1.5 2.3e-5 |
Time | #time(09,15,00) |
Date | #date(2013,02,26) |
DateTime | #datetime(2013,02,26, 09,15,00) |
DateTimeZone | #datetimezone(2013,02,26, 09,15,00, 09,00) |
Durata | #duration(0,1,30,0) |
Text | "hello" |
Binario | #binary("AQID") |
Elenco | {1, 2, 3} |
Record | [ A = 1, B = 2 ] |
Tabella | #table({"X","Y"},{{0,1},{1,0}}) |
Funzione | (x) => x + 1 |
Tipo | type { number } type table [ A = any, B = text ] |
Nelle sezioni seguenti viene descritto in dettaglio ogni tipo di valore. I tipi e le relative attribuzioni vengono definiti formalmente nella sezione Tipi, mentre i valori di funzione vengono definiti nella sezione Funzioni. Nelle sezioni seguenti vengono inoltre elencati gli operatori definiti per ogni tipo di valore e vengono forniti alcuni esempi. La definizione completa della semantica degli operatori è disponibile nella sezione Operatori.
Null
Con un valore Null si rappresenta l'assenza di un valore o un valore con uno stato indeterminato o sconosciuto. Un valore Null viene scritto usando il valore letterale null
. Per i valori Null vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x > y |
Maggiore di |
x >= y |
Maggiore di o uguale a |
x < y |
Minore di |
x <= y |
Minore di o uguale a |
x = y |
Uguale |
x <> y |
Non uguale |
x ?? y |
Coalesce |
Il tipo nativo del valore null
è il tipo intrinseco null
.
Logico
Un valore logico viene usato per le operazioni booleane e può avere il valore true o false. Un valore logico viene scritto usando i valori letterali true
e false
. Per i valori logici vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x > y |
Maggiore di |
x >= y |
Maggiore di o uguale a |
x < y |
Minore di |
x <= y |
Minore o uguale |
x = y |
Uguale |
x <> y |
Non uguale |
x or y |
OR logico condizionale |
x ?? y |
Coalesce |
x and y |
AND logico condizionale |
not x |
operatore logico NOT |
Il tipo nativo di entrambi i valori logici (true
e false
) è il tipo intrinseco logical
.
Numero
Un valore numero viene usato per le operazioni numeriche e aritmetiche. Di seguito sono riportati alcuni esempi di valori letterali numerici:
3.14 // Fractional number
-1.5 // Fractional number
1.0e3 // Fractional number with exponent
123 // Whole number
1e3 // Whole number with exponent
0xff // Whole number in hex (255)
Un numero viene rappresentato con almeno la precisione di un Double (ma può mantenere una precisione maggiore). La rappresentazione doppia è conforme allo standard di precisione doppia IEEE 64 bit per l'aritmetica a virgola mobile binaria definita in [IEEE 754-2008]. La rappresentazione doppia presenta un intervallo dinamico approssimativo compreso tra 5 x 10324 e 1,7 x 10308 con una precisione di 15-16 cifre.
Sono considerati valori numero anche i valori speciali seguenti:
Zero positivo e zero negativo. Nella maggior parte dei casi, zero positivo e zero negativo si comportano in modo identico al semplice valore zero, sebbene alcune operazioni facciano distinzione tra i due valori.
Infinito positivo (
#infinity
) e infinito negativo (-#infinity
). Gli infiniti sono prodotti da operazioni quali la divisione di un numero diverso da zero per zero.1.0 / 0.0
restituisce ad esempio un infinito positivo, mentre-1.0 / 0.0
restituisce un infinito negativo.Il valore Not-a-Number (
#nan
), spesso abbreviato con NaN. I valori NaN sono prodotti da operazioni a virgola mobile non valide, come la divisione di zero per zero.
Le operazioni matematiche binarie vengono eseguite usando una precisione, La precisione determina il dominio in cui vengono arrotondati gli operandi e il dominio in cui viene eseguita l'operazione. In assenza di una precisione specificata in modo esplicito, queste operazioni vengono eseguite usando la precisione doppia.
Se il risultato di un'operazione matematica è troppo piccolo per il formato di destinazione, il risultato dell'operazione diventa zero positivo o zero negativo.
Se il risultato di un'operazione matematica è troppo grande per il formato di destinazione, il risultato dell'operazione diventa un infinito positivo o un infinito negativo.
Se un'operazione matematica non è valida, il risultato dell'operazione diventa NaN.
Se uno o entrambi gli operandi di un'operazione a virgola mobile è NaN, il risultato dell'operazione diventa NaN.
Per i valori numero vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x > y |
Maggiore di |
x >= y |
Maggiore di o uguale a |
x < y |
Minore di |
x <= y |
Minore o uguale a |
x = y |
Uguale |
x <> y |
Non uguale |
x + y |
Somma |
x - y |
Differenza |
x * y |
Prodotto |
x / y |
Quoziente |
x ?? y |
Coalesce |
+x |
Più unario |
-x |
Negazione |
Il tipo nativo dei valori numero è il tipo intrinseco number
.
Tempo
Nel valore ora viene archiviata una rappresentazione opaca dell'ora del giorno. Un orario viene codificato come il numero di tick dalla mezzanotte, che conteggia i tick di 100 nanosecondi che sono trascorsi su un orologio a 24 ore. Il numero massimo di tick dalla mezzanotte corrisponde a 23:59:59,9999999 ore.
Sebbene non esista una sintassi letterale per i tempi, sono disponibili diverse funzioni della libreria standard per costruirli. Gli orari possono anche essere creati usando la funzione intrinseca #time
:
#time(hour, minute, second)
Devono essere rispettate le seguenti condizioni; in caso contrario, viene generato un errore con il codice motivo Expression.Error
.
0 ≤ ora ≤ 24
0 ≤ minuto ≤ 59
0 ≤ secondo ≤ 59
Inoltre, se ora = 24, il minuto e il secondo devono essere pari a zero.
Per i valori ora vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore di o uguale a |
x ?? y |
Coalesce |
Gli operatori seguenti consentono a uno o a entrambi gli operandi di essere una data:
Operatore | Operando sinistro | Operando destro | Significato |
---|---|---|---|
x + y |
time |
duration |
Offset della data in base alla durata |
x + y |
duration |
time |
Offset della data calcolato in base alla durata |
x - y |
time |
duration |
Disallineamento della data per durata negativa |
x - y |
time |
time |
Durata tra le date |
x & y |
date |
time |
Data e ora combinati |
Il tipo nativo dei valori di tempo è il tipo intrinseco time
.
Data
Nel valore data viene archiviata una rappresentazione opaca di un giorno specifico. Un valore data viene codificato come numero di giorni trascorsi dalla data epoch, partendo dal 1° gennaio 0001 DC sul calendario gregoriano. Il numero massimo di giorni trascorsi dalla data epoch è 3.652.058, corrispondente al 31 dicembre 9999.
Sebbene non esista una sintassi letterale per le date per crearle sono disponibili varie funzioni della libreria standard. Le date possono essere create anche usando la funzione intrinseca #date
:
#date(year, month, day)
La condizione seguente deve essere soddisfatta; in caso contrario, viene generato un errore con il codice motivo Expression.Error
.
1 ≤ anno ≤ 9999
1 ≤ mese ≤ 12
1 ≤ giorno ≤ 31
Inoltre, il giorno deve essere valido per il mese e l'anno scelti.
Per i valori data vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore o uguale a |
x ?? y |
Coalesce |
Gli operatori seguenti consentono a uno o a entrambi gli operandi di essere una data:
Operatore | Operando sinistro | Operando destro | Significato |
---|---|---|---|
x + y |
date |
duration |
Offset della data in base alla durata |
x + y |
duration |
date |
Spostamento della data in base alla durata |
x - y |
date |
duration |
Spostamento della data basato sulla durata sottratta |
x - y |
date |
date |
Durata tra le date |
x & y |
date |
time |
Datetime unificato |
Il tipo nativo dei valori data è il tipo intrinseco date
.
Data/Ora
Un valore datetime contiene una data e un'ora.
Sebbene non esista una sintassi letterale per i valori datetime, per crearli sono disponibili varie funzioni della libreria standard. I valori datetime possono essere creati anche usando la funzione intrinseca #datetime
:
#datetime(year, month, day, hour, minute, second)
Devono essere rispettati gli intervalli seguenti; in caso contrario, viene generato un errore con codice di errore Expression.Error: 1 ≤ anno ≤ 9999
1 ≤ mese ≤ 12
1 ≤ giorno ≤ 31
0 ≤ ora ≤ 23
0 ≤ minuto ≤ 59
0 ≤ secondo ≤ 59
Inoltre, il giorno deve essere valido per il mese e l'anno scelti.
Per i valori datetime vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore di o uguale a |
x ?? y |
Coalesce |
Gli operatori seguenti consentono di utilizzare uno o entrambi gli operandi come valore datetime.
Operatore | Operando sinistro | Operando destro | Significato |
---|---|---|---|
x + y |
datetime |
duration |
Offset di datetime in base alla durata |
x + y |
duration |
datetime |
Offset della data e ora in base alla durata |
x - y |
datetime |
duration |
Offset di datetime in base alla durata negata |
x - y |
datetime |
datetime |
Durata tra date e ore |
Il tipo nativo dei valori datetime è il tipo intrinseco datetime
.
DateTimeZone
Un valore datetimezone contiene un valore datetime e un fuso orario. Un fuso orario viene codificato come un numero di minuti di offset rispetto all'UTC, che indica di quanti minuti la parte temporale del datetime dovrebbe essere spostata rispetto al Tempo Coordinato Universale (UTC). Il numero minimo di offset dei minuti rispetto a UTC è -840, che rappresenta uno scarto UTC di -14:00, ovvero quattordici ore prima dell'ora UTC. Il numero massimo di minuti di offset rispetto a UTC è 840, corrispondente a un offset UTC di 14:00.
Sebbene non esista una sintassi letterale per i valori datetimezone, per crearli sono disponibili varie funzioni della libreria standard. I valori datetimezone possono essere creati anche usando la funzione intrinseca #datetimezone
:
#datetimezone(
year, month, day,
hour, minute, second,
offset-hours, offset-minutes)
Devono essere rispettati gli intervalli seguenti; in caso contrario, viene generato un errore con il codice motivo Expression.Error
.
1 ≤ anno ≤ 9999
1 ≤ mese ≤ 12
1 ≤ giorno ≤ 31
0 ≤ ora ≤ 23
0 ≤ minuto ≤ 59
0 ≤ secondo ≤ 59
-14 ≤ scarto-ore ≤ 14
-59 ≤ offset-minuti ≤ 59
Inoltre, il giorno deve essere valido per il mese e l'anno scelti e, se ore-offset = 14, allora minuti-offset < = 0 e, se ore-offset = -14, allora minuti-offset > = 0.
Per i valori datetimezone vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore o uguale a |
x ?? y |
Coalesce |
Gli operatori seguenti consentono a uno o a entrambi gli operandi di essere un datetimezone.
Operatore | Operando sinistro | Operando destro | Significato |
---|---|---|---|
x + y |
datetimezone |
duration |
Offset del fuso orario modificato dalla durata |
x + y |
duration |
datetimezone |
Offset di datetimezone in base alla durata |
x - y |
datetimezone |
duration |
Offset di datetimezone in base alla durata negata |
x - y |
datetimezone |
datetimezone |
Durata tra data e ora con fuso orario |
Il tipo nativo dei valori datetimezone è il tipo intrinseco datetimezone
.
Durata
Un valore durata memorizza una rappresentazione opaca della distanza tra due punti su una sequenza temporale misurata in tick da 100 nanosecondi. L'entità di una durata può essere positiva o negativa, con i valori positivi che indicano l'avanzamento in avanti nel tempo e i valori negativi che indicano l'avanzamento indietro nel tempo. Il valore minimo che può essere archiviato in una durata è -9.223.372.036.854.775.808 tick ovvero 10.675.199 giorni, 2 ore, 48 minuti e 05,4775808 secondi indietro nel tempo. Il valore massimo che può essere archiviato in una durata è 9.223.372.036.854.775.807 tick ovvero 10.675.199 giorni, 2 ore, 48 minuti e 05,4775807 secondi in avanti nel tempo.
Sebbene non esista una sintassi letterale per i valori di durata, per crearli sono disponibili varie funzioni della libreria standard. I valori di durata possono essere creati anche usando la funzione intrinseca #duration
:
#duration(0, 0, 0, 5.5) // 5.5 seconds
#duration(0, 0, 0, -5.5) // -5.5 seconds
#duration(0, 0, 5, 30) // 5.5 minutes
#duration(0, 0, 5, -30) // 4.5 minutes
#duration(0, 24, 0, 0) // 1 day
#duration(1, 0, 0, 0) // 1 day
Per i valori durata vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore o uguale a |
x ?? y |
Coalesce |
Gli operatori seguenti, inoltre, consentono a uno o a entrambi gli operandi di essere un valore durata:
Operatore | Operando sinistro | Operando destro | Significato |
---|---|---|---|
x + y |
datetime |
duration |
Offset della data e ora in base alla durata |
x + y |
duration |
datetime |
Offset della data e ora per la durata |
x + y |
duration |
duration |
Somma delle durate |
x - y |
datetime |
duration |
Offset di datetime con durata negativa |
x - y |
datetime |
datetime |
Durata tra date e orari |
x - y |
duration |
duration |
Differenza tra le durate |
x * y |
duration |
number |
N volte una durata |
x * y |
number |
duration |
N volte una durata |
x / y |
duration |
number |
Frazione di una durata |
x / y |
duration |
duration |
Quoziente numerico delle durate |
Il tipo nativo dei valori durata è il tipo intrinseco duration
.
Testo
Un valore testo rappresenta una sequenza di caratteri Unicode. I valori testo presentano un formato letterale conforme alla grammatica seguente:
_text-literal:
"
text-literal-charactersopt"
text-literal-characters:
carattere-letterale-di-testo caratteri-letterali-di-testoopt
testo-letterale-carattere:
singolo carattere di testo
sequenza di escape dei caratteri
sequenza di escape per le doppie virgolette
single-text-character:
Qualsiasi carattere ad eccezione di "
(U+0022
) o #
(U+0023
), seguito da (
(U+0028
)
double-quote-escape-sequence:
""
(U+0022
, U+0022
)
Di seguito è riportato un esempio di un valore testo:
"ABC" // the text value ABC
Per i valori testo vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore o uguale a |
x & y |
Concatenazione |
x ?? y |
Coalescere |
Il tipo nativo dei valori testo è il tipo intrinseco text
.
Binario
Un valore binario rappresenta una sequenza di byte,
Sebbene non esista una sintassi letterale per i valori binari, per crearli sono disponibili varie funzioni della libreria standard. I valori binari possono essere creati anche usando la funzione intrinseca #binary
.
Nell'esempio seguente viene creato un valore binario da un elenco di byte:
#binary( {0x00, 0x01, 0x02, 0x03} )
Per i valori binari vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x >= y |
Maggiore di o uguale a |
x > y |
Maggiore di |
x < y |
Minore di |
x <= y |
Minore o uguale a |
x ?? y |
Coalesce |
Il tipo nativo dei valori binari è il tipo intrinseco binary.
Elenco
Un valore elenco è un valore che produce una sequenza di valori nel momento in cui vengono enumerati. Un valore prodotto da un elenco può contenere qualsiasi tipo di valore, incluso un elenco. È possibile creare un elenco usando la sintassi di inizializzazione, come indicato di seguito:
list-expression:
{ item-listopt }
elenco articoli:
oggetto
elemento,
elenco-elementi
elemento
espressione
expression..
expression
Di seguito è riportato un esempio di list-expression che definisce un elenco con tre valori di testo: "A"
, "B"
e "C"
.
{"A", "B", "C"}
Il valore "A"
è il primo elemento dell'elenco, il valore "C"
è l'ultimo.
- Solo nel momento in cui si accede agli elementi di un elenco è possibile valutarli.
- Mentre dai valori elenco creati usando la sintassi elenco, gli elementi vengono generati nell'ordine in cui appaiono in item-list, in generale, gli elenchi restituiti dalle funzioni di libreria possono produrre un set o un numero diverso di valori ogni volta che vengono enumerati.
Per includere una sequenza di numeri interi in un elenco, è possibile usare il formato a..b
:
{ 1, 5..9, 11 } // { 1, 5, 6, 7, 8, 9, 11 }
Il numero di elementi in un elenco, definito anche conteggio elenco, può essere determinato tramite la funzione List.Count
.
List.Count({true, false}) // 2
List.Count({}) // 0
Un elenco, di fatto, può avere un numero infinito di elementi; per questi elenchi, il valore List.Count
non è definito ed è possibile che generi un errore o che non venga terminato.
Se un elenco non contiene elementi, viene definito elenco vuoto. Un elenco vuoto viene scritto come segue:
{} // empty list
Per gli elenchi vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x & y |
Concatena |
x ?? y |
Coalesce |
Ad esempio:
{1, 2} & {3, 4, 5} // {1, 2, 3, 4, 5}
{1, 2} = {1, 2} // true
{2, 1} <> {1, 2} // true
Il tipo nativo dei valori elenco è il tipo intrinseco list
, che specifica un elemento di tipo any
.
Registra
Un valore record è una sequenza ordinata di campi. Un campo è costituito da un nome campo, ovvero un valore di testo che identifica in modo univoco il campo all'interno del record, e da un valore campo. Il valore di un campo può essere di qualsiasi tipo, incluso un record. È possibile creare un record usando la sintassi di inizializzazione, come indicato di seguito:
record-expression:
[
field-listopt]
field-list:
campo
campo,
lista-di-campi
campo:
nome-campo=
espressione
nome del campo
identificatore generalizzato
identificatore citato
Nell'esempio seguente viene creato un record con un campo denominato x
con valore 1
e un campo denominato y
con valore 2
.
[ x = 1, y = 2 ]
Nell'esempio seguente viene creato un record con un campo denominato a
con un valore di record annidato. Il record annidato include un campo denominato b
con valore 2
.
[ a = [ b = 2 ] ]
Quando si valuta l'espressione di un record, sono valide le considerazioni seguenti:
L'espressione assegnata a ogni nome di campo consente di determinare il valore del campo associato.
Se l'espressione assegnata a un nome di campo produce un valore quando viene valutata, il valore prodotto diventa il valore del campo del record risultante.
Se l'espressione assegnata a un nome di campo genera un errore quando viene valutata, insieme al campo viene registrata anche la presenza di un errore e il valore dell'errore generato. Al successivo accesso al campo, verrà nuovamente generato un errore, insieme al valore dell'errore registrato.
L'espressione viene valutata in un ambiente simile all'ambiente padre in cui sono unite solo le variabili, che corrispondono al valore di ogni campo del record, ad eccezione di quello inizializzato.
Un valore in un record non viene valutato fino a quando non si accede al campo corrispondente.
Il valore di un record non può essere valutato più di una volta.
Il risultato dell'espressione è un valore record con un record di metadati vuoto.
L'ordine dei campi all'interno del record viene definito in base all'ordine in cui appaiono in record-initializer-expression.
Ogni nome di campo specificato deve essere univoco all'interno del record; in caso contrario, è un errore. I nomi vengono confrontati usando un confronto ordinale.
[ x = 1, x = 2 ] // error: field names must be unique
[ X = 1, x = 2 ] // OK
Un record senza campi prende il nome record vuoto e viene scritto come segue:
[] // empty record
Anche se l'ordine dei campi di un record non è significativo quando si accede a un campo o si confrontano due record, è significativo in altri contesti, ad esempio quando vengono enumerati i campi di un record.
Gli stessi due record producono risultati diversi quando vengono ottenuti i campi:
Record.FieldNames([ x = 1, y = 2 ]) // [ "x", "y" ]
Record.FieldNames([ y = 1, x = 2 ]) // [ "y", "x" ]
Il numero di campi in un record può essere determinato tramite la funzione Record.FieldCount
. Ad esempio:
Record.FieldCount([ x = 1, y = 2 }) // 2
Record.FieldCount([]) // 0
È possibile creare i record non solo usando la sintassi di inizializzazione dei record [ ]
, ma anche da un elenco di valori e un elenco di nomi di campo o un tipo record. Ad esempio:
Record.FromList({1, 2}, {"a", "b"})
L'espressione precedente è equivalente a:
[ a = 1, b = 2 ]
Per i valori record vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x & y |
Unire |
x ?? y |
Coalescere |
Negli esempi seguenti vengono illustrati gli operatori precedenti. In caso di sovrapposizione di nomi di campi, l'unione dei record utilizza i campi dell'operando di destra per sovrascrivere i campi dell'operando di sinistra.
[ a = 1, b = 2 ] & [ c = 3 ] // [ a = 1, b = 2, c = 3 ]
[ a = 1, b = 2 ] & [ a = 3 ] // [ a = 3, b = 2 ]
[ a = 1, b = 2 ] = [ b = 2, a = 1 ] // true
[ a = 1, b = 2, c = 3 ] <> [ a = 1, b = 2 ] // true
Il tipo nativo dei valori record è il tipo intrinseco record
, che specifica un elenco vuoto e aperto di campi.
Tabella
Un valore tabella è una sequenza ordinata di righe. Un riga è una sequenza ordinata di valori di colonna. Il tipo tabella determina la lunghezza di tutte le righe della tabella, i nomi delle colonne della tabella, i tipi delle colonne della tabella e la struttura delle chiavi della tabella, se presenti.
Sebbene non esista una sintassi letterale per le tabelle, per crearle sono disponibili varie funzioni della libreria standard. Le tabelle possono essere create anche usando la funzione intrinseca #table
.
L'esempio seguente crea una tabella da un elenco di nomi di colonna e da un elenco di righe. La tabella risultante conterrà due colonne di type any
e tre righe.
#table({"x", "x^2"}, {{1,1}, {2,4}, {3,9}})
#table
può essere usato anche per specificare un tipo di tabella completa:
#table(
type table [Digit = number, Name = text],
{{1,"one"}, {2,"two"}, {3,"three"}}
)
In questo caso, il nuovo valore di tabella include un tipo tabella che specifica i nomi e i tipi di colonna.
Per i valori tabella vengono definiti gli operatori seguenti:
Operatore | Risultato |
---|---|
x = y |
Uguale |
x <> y |
Non uguale |
x & y |
Concatenazione |
x ?? y |
Coalesce |
La concatenazione di tabella allinea le colonne con nomi simili e inserisce null
nelle colonne che appaiono in un'unica tabella degli operandi. Nell'esempio seguente viene illustrata la concatenazione di tabella:
#table({"A","B"}, {{1,2}})
& #table({"B","C"}, {{3,4}})
A | B | A |
---|---|---|
1 |
2 |
null |
null |
3 |
4 |
Il tipo nativo dei valori di tabella è un tipo tabella personalizzato (derivato dal tipo intrinseco table
) che elenca i nomi delle colonne e specifica che le tabelle possono essere di qualsiasi tipo e che non sono presenti chiavi. Per informazioni dettagliate sui tipi tabella, vedere Tipi tabella.
Funzione
Un valore funzione è un valore che associa un set di argomenti a un singolo valore. I dettagli dei valori funzione sono descritti nella sezione Funzioni.
Digita
Un valore tipo è un valore che classifica altri valori. I dettagli dei valori tipo sono descritti nella sezione Tipi.