La funzione SELECT combina, filtra e converte dati
del database e messaggi complessi.
SINTASSI
Note:
- Le parentesi non sono più necessarie nelle espressioni SELECT.
Ciò non impedisce di utilizzare le parentesi, ma, se presenti, esse vengono
considerate normali parentesi nell'ambito dell'espressione.
- Solo per il parametro COUNT, è possibile specificare il valore della seguente Expression come un singolo asterisco (*).
Utilizzo
La
funzione SELECT è il modo solito e più efficiente di convertire i
messaggi.
E' possibile utilizzare SELECT per:
- Riformattare completamente i messaggi
- Accedere alle tabelle del database
- Creare un array di output che è un insieme secondario di un array di input
- Creare un array di output che contiene solo i valori di un array di input
- Contare il numero di elementi in un array
- Selezionare il valore minimo o massimo da un numero di elementi in un array
- Sommare i valori in un array
Introduzione a SELECT
La
funzione SELECT considera una struttura ad albero del messaggio (o una
struttura ad albero secondaria) come composta da un numero di
"righe" e
"colonne", come una tabella del database. Un parametro
FieldReference in una clausola FROM identifica
un campo in una struttura ad albero del messaggio e:
- Il campo identificato viene considerato come una
"riga" in una tabella.
- I sibling del campo vengono considerati come altre "righe" della stessa "tabella".
- I child del campo vengono considerati come "colonne" della tabella.
Nota: FieldReference in una clausola FROM può
essere anche un riferimento di tabella che fa riferimento direttamente ad
una tabella del database reale.
Il valore di ritorno della funzione SELECT è generalmente
un'altra struttura ad albero del messaggio che contiene
"righe" la cui struttura e contenuto sono determinati da
SelectClause.
Il numero di righe nel risultato è la somma di tutte le
"righe" indicate da tutti i riferimenti di campo e di tabella nella
clausola FROM, filtrati dalla clausola
WHERE; sono inclusi solo i campi per cui la clausola WHERE è TRUE.
Il valore di ritorno della funzione SELECT può essere anche scalare
(consultare Selezioni ITEM).
E' possibile
specificare
SelectClause in diversi modi; consultare:
Selezioni
semplici
Per comprendere più dettagliatamente la funzione SELECT, considerare
un caso semplice in cui:
- SelectClause consiste di un numero di espressioni,
ciascuna con una clausola
AS Path.
- La clausola FROM contiene un singolo
FieldReference ed una clausola
AS CorrelationName.
La funzione SELECT crea una variabile di correlazione di riferimento
locale, il cui nome è indicato dalla clausola AS
CorrelationName e quindi passa attraverso ciascuna
"riga" dell'elenco di righe derivato dalla clausola FROM. Per ciascuna
"riga":
- La variabile di correlazione è impostata in modo da puntare alla
"riga" corrente.
- La clausola WHERE (se presente) viene valutata. Se il risultato è FALSE o
sconosciuto
(null), non viene aggiunto alcun elemento alla struttura ad albero
risultante e l'elaborazione continua alla
"riga" successiva dell'input. In caso contrario, l'elaborazione
procede con il passo successivo.
- All'elenco dei risultati viene aggiunto un nuovo membro.
- Le espressioni della clausola SELECT vengono valutate ed assegnate ai
campi indicati dalla clausola
AS Path. Tali campi sono campi child del nuovo membro
dell'elenco dei risultati.
Generalmente, le espressioni
SelectClause e della clausola WHERE
utilizzano la variabile di correlazione per accedere ai valori della
"colonna"
(i campi nella struttura ad albero del messaggio di input) e per creare una
nuova struttura ad albero del messaggio che contiene dati dal messaggio di
input. La variabile di correlazione è indicata dal nome specificato nella clausola
AS CorrelationName oppure, se la clausola
AS non è specificata, dal nome finale in
FROM FieldReference (il nome dopo l'ultimo punto).
Notare che:
- Nonostante l'analogia con una tabella, non esiste alcuna limitazione
per l'accesso o la creazione di messaggi con una struttura simile a quella
di una tabella; è possibile accedere e creare strutture ad albero con
strutture di cartella di qualsiasi profondità.
- La "colonna" non deve essere un valore singolo; una colonna può
essere una struttura o un valore di elenco ripetuto.
Tali concetti sono più facilmente comprensibili facendo riferimento
agli esempi.
Se il riferimento di campo è realmente un
TableReference, l'operazione è molto simile. In questo caso, l'input è una reale tabella del database ed è limitata alle
strutture semplici supportate dai database. Tuttavia, la struttura ad albero del risultato non è limitata.
Se esiste più di un riferimento di campo in una clausola FROM, il
riferimento più a destra passa attraverso ciascuna delle proprie righe per
ciascuna riga nel riferimento accanto a quello più a destra e così via.
Il numero totale di righe nel risultato è quindi il prodotto nel numero di
righe in ciascuna tabella. Tali operazioni select sono conosciute come unioni e utilizzano
normalmente una clausola
WHERE che esclude la maggior parte di tali righe dal risultato. Le unioni sono generalmente utilizzate per aggiungere dati del database ai
messaggi.
La clausola AS
Path è facoltativa. Se non viene specificata, il broker genera un nome predefinito in base
alle seguenti regole:
- Se l'espressione SelectClause è un riferimento ad
un campo oppure un'assegnazione di un riferimento ad un campo, viene utilizzato
il nome del campo.
- In caso contrario, il broker utilizza i nomi predefiniti
"Column1", "Column2" e così via.
Esempi
Il seguente esempio
esegue una funzione SELECT sulla tabella "Parts" nello schema
"Shop" nel database "DSN1". Poiché non esiste la clausola
WHERE, vengono selezionate tutte le righe.
Poiché l'espressione della clausola select (ad esempio,
P.PartNumber) non contiene clausole
AS, i campi nel risultato hanno gli stessi nomi:
SET PartsTable.Part[] = SELECT
P.PartNumber,
P.Description,
P.Price
FROM Database.DSN1.Shop.Parts AS P;
Se la destinazione
dell'istruzione SET ("PartsTable") è una variabile di tipo
ROW, dopo l'esecuzione dell'istruzione
PartsTable avrà, come child del relativo elemento root, un campo chiamato
"Part" per ciascuna riga nella tabella. Ciascuno dei campi
"Part" avrà campi child chiamati
"PartNumber", "Description" e "Price".
I campi child avranno valori indicati dal contenuto della tabella. "PartsTable" può essere anche un riferimento in una struttura ad albero del messaggio.
L'esempio successivo esegue una funzione SELECT simile. Questo caso è differente dal precedente perché la funzione SELECT viene
eseguita sulla struttura ad albero del messaggio prodotta dal primo esempio (e
non su una reale tabella del database). Il risultato è assegnato in una cartella secondaria di
"OutputRoot":
SET OutputRoot.XML.Data.TableData.Part[] = SELECT
P.PartNumber,
P.Description,
P.Price
FROM PartsTable.Part[] AS P;
Selezioni
INSERT
La clausola INSERT è un'alternativa alla clausola AS.
Assegna il risultato dell'espressione
SelectClause (che deve essere una riga) alla nuova riga
corrente e non ad un child della riga.
L'effetto di questa operazione è l'unione del risultato della riga
dell'espressione nella riga generata da SELECT. Ciò è differente dalla clausola AS perché la clausola AS genera sempre
almeno un elemento child prima di aggiungere un risultato, mentre INSERT non
genera elementi child. INSERT è utile quando si inseriscono dati da altre operazioni SELECT, perché
consente di unire i dati senza cartelle supplementari.
Selezioni
ITEM
SelectClause può essere formata dalla
parola chiave ITEM e da un'espressione singola. L'effetto di questa operazione è quello di rendere i risultati senza nome. Il risultato è un elenco di valori del tipo restituito dall'espressione e
non un riga. Questa opzione ha diversi utilizzi:
- Insieme ad un'espressione scalare ed alla funzione THE, può essere
utilizzata per creare una query SELECT che restituisce un singolo valore
scalare (ad esempio, il prezzo di un particolare articolo da una tabella).
- Insieme ad un'espressione CASE ed ai costruttori ROW, può essere
utilizzata per creare una query SELECT che crea o gestisce messaggi in cui la
struttura di alcune
"righe" (ripetizioni nel messaggio) è differente da altre. Ciò è utile per la gestione dei messaggi che hanno una struttura ripetuta ma in cui le ripetizioni non hanno tutte la stessa struttura.
- Insieme ad un costruttore ROW, può essere utilizzata per creare una query
SELECT che comprime i livelli di ripetizione nel messaggio di input.
Selezioni
di funzioni di colonna
SelectClause può essere formata da una delle
funzioni COUNT, MAX, MIN e SUM che eseguono operazioni su
un'espressione.
Tali funzioni sono conosciute come funzioni di colonna. Esse restituiscono un valore scalare singolo (non un elenco) che fornisce il
conteggio, il massimo, il minimo o la somma dei valori
valutati da Expression nel passaggio attraverso le
righe della clausola FROM. Se il risultato di Expression è NULL per una particolare
riga, il valore viene ignorato e la funzione restituisce il conteggio, il
massimo, il minimo o la somma delle righe rimanenti.
Solo per la funzione COUNT,
Expression può essere formata da un singolo asterisco
(*). Questa forma conteggia le righe indipendentemente dai valori null.
Per fare in modo che il risultato rifletta in modo utile il messaggio di
input, generalmente
Expression contiene la variabile di correlazione.
Generalmente, Expression ha come risultato lo
stesso tipo di dati per ciascuna riga. In questi casi, il risultato delle funzioni
MAX,
MIN e SUM sarà dello stesso tipo di dati degli operandi. I valori restituiti non devono essere tutti dello stesso tipo e, nel caso non
lo siano, vengono applicate le normali regole aritmetiche. Ad esempio, se un campo in una struttura di messaggio ripetuta contiene valori
integer per alcune righe e valori float per altre, la somma segue le normali
regole per l'addizione. Il risultato sarà di tipo float perché l'operazione è equivalente all'aggiunta
di un numero di valori integer e float.
Il risultato della funzione COUNT è sempre un integer.
Differenze
tra le selezioni di database e messaggi
Le espressioni FROM in cui una variabile di correlazione
rappresenta una riga in un messaggio funzionano diversamente da
quelle in cui la variabile di correlazione rappresenta una riga in una
tabella del database reale.
Nel caso del messaggio, un percorso che contiene l'asterisco
(*) ha il normale significato; ignora il nome del campo e rileva il primo campo
che corrisponde agli eventuali altri criteri.
Nel caso del database, l'asterisco (*) indica
"tutti i campi". Questo significato speciale richiede una conoscenza
avanzata della definizione della tabella del database ed è supportato solo
quando si esegue una query del database predefinito (il database indicato
dall'attributo
data source del nodo). Ad esempio, le seguenti query
restituiscono coppie nome/valore della colonna solo quando si esegue la query
del database predefinito:
SELECT * FROM Database.Datasource.SchemaName.Table As A
SELECT A.* FROM Database.Datasource.SchemaName.Table As A
SELECT A FROM Database.Datasource.SchemaName.Table AS A
Specifica
delle espressioni SELECT
- SelectClause
- Le espressioni SelectClause possono utilizzare tutte le funzioni e tutti gli operatori del broker in qualsiasi combinazione. Possono fare riferimento alle colonne delle tabelle, ai campi di messaggi, ai nomi di correlazione dichiarati dalle SELECT che li contengono e a qualsiasi altra variabile o costante dichiarata che sia nello stesso ambito.
- AS Path
- Un'espressione AS Path è un percorso relativo
(non esiste alcun nome di correlazione)ma non è limitata in alcun
modo. Ad esempio, può contenere:
- Indici (ad esempio, A.B.C[i])
- Specificatori del tipo di campo (ad esempio,
A.B.(XML.Attribute)C )
- Percorsi con più parti (ad esempio, A.B.C )
- Espressioni di nome (ad esempio, A.B.{var})
Inoltre tutte le espressioni in questi percorsi possono utilizzare tutte le funzioni e tutti gli operatori del broker in qualsiasi combinazione. Le espressioni possono fare riferimento alle colonne delle tabelle, ai campi di messaggi, ai nomi di correlazione dichiarati dalle SELECT che li contengono e a qualsiasi variabile o costante dichiarata.
- Clausola FROM
- Le espressioni della clausola FROM possono contenere più riferimenti al
database, più riferimenti di messaggio ed una miscela di entrambi, E' possibile unire tabelle con tabelle, messaggi con messaggi oppure tabelle con
messaggi.
I FieldReference della clausola FROM possono contenere
espressioni di qualsiasi tipo (ad esempio,
Database.{DataSource}.{Schema}.Table1).
E' possibile
calcolare un campo, un'origine dati, uno schema o un nome di tabella al
runtime.
- Clausola WHERE
L'espressione della clausola WHERE può utilizzare tutte le funzioni e tutti gli operatori del broker in qualsiasi combinazione. Può fare riferimento a colonne di tabella, campi di messaggi e a costanti o
variabili dichiarate.
Tuttavia, tenere presente che il broker considera
l'espressione della clausola WHERE esaminando l'espressione e decidendo se
l'intera espressione può essere valutata dal database.
Se l'operazione è possibile, essa viene fornita al
database. Per essere valutata dal database, devono essere utilizzati solo gli
operatori e le funzioni supportati dal database.
La clausola WHERE, tuttavia, può fare riferimento a campi di
messaggi, a nomi di correlazione dichiarati dalle istruzioni SELECT e ad altre
costanti o variabili dichiarate all'interno dell'ambito.
Se l'intera espressione non può essere valutata dal
database, il broker ricerca gli operatori AND di livello principale ed esamina
separatamente ciascuna espressione secondaria. Quindi, prova a fornire al database le espressioni secondarie che possono
essere valutate, lasciando al broker il compito di valutare le altre. E' necessario tenere presente tali informazioni per due motivi:
- Le modifiche apparentemente insignificanti alle espressioni della
clausola WHERE possono avere effetti rilevanti sulle prestazioni. E' possibile determinare la quantità di espressione fornita al database
esaminando una traccia utente.
- Alcune funzioni del database operano in modo leggermente diverso rispetto a quelle del broker.
Relazione
alla funzione THE
E' possibile utilizzare la funzione
THE (che restituisce il primo elemento di un elenco) insieme alla funzione
SELECT per creare un risultato non di elenco.
Ciò è utile, ad
esempio, quando una query SELECT deve restituire
non più di un elemento. E' particolarmente utile
insieme a ITEM
(consultare Selezioni ITEM).
Differenze da SQL standard
La
funzione SELECT ESQL
è differente dalla funzione SELECT SQL del database per i seguenti motivi:
- ESQL può produrre dati di risultato in una struttura ad albero
- ESQL può accettare gli array nelle clausole SELECT
- ESQL dispone della funzione THE e dei
parametri ITEM ed INSERT
- ESQL non dispone della funzione SELECT ALL in questo rilascio
- ESQL non dispone della funzione ORDER BY in questo
rilascio
- ESQL non dispone della funzione SELECT DISTINCT in questo rilascio
- ESQL non dispone dei parametri GROUP BY o HAVING in questo rilascio
- ESQL non dispone della funzione di colonna AVG in questo rilascio
Limitazioni
Al
rilascio corrente sono applicate le seguenti limitazioni:
- Quando un comando SELECT viene eseguito su più di una tabella del
database, tutte le tabelle devono essere nella stessa istanza del database. I TableReference non devono specificare nomi di origine dati
differenti.
- Se la clausola FROM fa riferimento a messaggi e tabelle, le tabelle
devono precedere i messaggi nell'elenco.