Funzione SELECT

La funzione SELECT combina, filtra e converte dati del database e messaggi complessi.

SINTASSI

Note:
  1. 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.
  2. 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":
  1. La variabile di correlazione è impostata in modo da puntare alla "riga" corrente.
  2. 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.
  3. All'elenco dei risultati viene aggiunto un nuovo membro.
  4. 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:
  1. Se l'espressione SelectClause è un riferimento ad un campo oppure un'assegnazione di un riferimento ad un campo, viene utilizzato il nome del campo.
  2. 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:
  1. 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.
  2. 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.
Concetti correlati
Panoramica di ESQL
Attività correlate
Sviluppo di ESQL
Conversione di un messaggio XML semplice
Conversione di un messaggio XML complesso
Restituzione di un valore scalare in un messaggio XML
Accesso ai database da ESQL
Riferimenti correlati
Diagrammi di sintassi: tipi disponibili
Funzioni ESQL complesse
Informazioni particolari | Marchi | Download | Libreria | Supporto | Commenti
Copyright IBM Corporation 1999, 2006 Ultimo aggiornamento: ago 17, 2006
ak05620_