Ausdruck-Unterabfragen

Es gibt vier Typen von Ausdruck-Unterabfragen, also von Unterabfragen, die als Ausdrücke verwendet werden. Ausdruck-Unterabfragen geben im Gegensatz zu einer Spalte oder Tabelle NULL oder einen einzelnen Wert zurück und müssen von Klammern umgeben sein. Weitere Informationen zu Unterabfragen finden Sie im Abschnitt Unterabfragen.

Unterabfragentyp Datentyp des Ergebnisses Beschreibung
Skalar Beliebiger Typ T Eine Unterabfrage in Klammern innerhalb eines Ausdrucks (z. B. in der SELECT-Liste oder WHERE-Klausel) wird als skalare Unterabfrage interpretiert. Die SELECT-Liste in einer skalaren Unterabfrage muss genau ein Feld haben. Wenn die Unterabfrage genau eine Zeile zurückgibt, ist dieser einzelne Wert das skalare Unterabfrageergebnis. Wenn die Unterabfrage keine Zeilen zurückgibt, ist der skalare Unterabfragenwert NULL. Wenn die Unterabfrage mehr als eine Zeile zurückgibt, schlägt die Abfrage mit einem Laufzeitfehler fehl. Wenn die Unterabfrage mit SELECT AS STRUCT geschrieben wird, kann sie mehrere Spalten enthalten. Der zurückgegebene Wert ist dann der erstellte STRUCT-Wert. Die Auswahl mehrerer Spalten ohne Verwendung von SELECT AS führt zu einem Fehler.
ARRAY ARRAY Kann SELECT AS STRUCT verwenden, um Arrays von Structs zu erstellen, und umgekehrt. Die Auswahl mehrerer Spalten ohne Verwendung von SELECT AS führt zu einem Fehler. Gibt ein leeres ARRAY zurück, wenn die Unterabfrage keine Zeilen zurückgibt. Gibt nie ein NULL-ARRAY zurück.
IN BOOL Tritt in einem Ausdruck nach dem IN-Operator auf. Die Unterabfrage muss eine einzelne Spalte erzeugen, deren Typ mit dem Ausdruck auf der linken Seite des IN-Operators gleichheitskompatibel ist. Gibt FALSE zurück, wenn die Unterabfrage Nullzeilen zurückgibt. x IN () entspricht x IN (value, value, ...). Die vollständige Semantik finden Sie unter Vergleichsoperatoren im Abschnitt zum Operator IN.
EXISTS BOOL Gibt TRUE zurück, wenn die Unterabfrage eine oder mehrere Zeilen erzeugt hat. Gibt FALSE zurück, wenn die Unterabfrage Nullzeilen erzeugt. Gibt niemals NULL zurück. Im Gegensatz zu allen anderen Ausdruck-Unterabfragen gibt es keine Regeln bezüglich der Spaltenliste. Es können beliebig viele Spalten ausgewählt werden. Das Abfrageergebnis wird davon nicht beeinflusst.

Beispiele

In den folgenden Beispielen für Ausdruck-Unterabfragen wird davon ausgegangen, dass t.int_array vom Typ ARRAY<INT64> ist.

Typ Unterabfrage Datentyp des Ergebnisses Hinweise
Skalar (SELECT COUNT(*) FROM t.int_array) INT64  
(SELECT DISTINCT i FROM t.int_array i) INT64, möglicher Laufzeitfehler  
(SELECT i FROM t.int_array i WHERE i=5) INT64, möglicher Laufzeitfehler  
(SELECT ARRAY_AGG(i) FROM t.int_array i) ARRAY Verwendet die ARRAY_AGG-Aggregationsfunktion, um ein ARRAY zurückzugeben.
(SELECT 'xxx' a) STRING  
(SELECT 'xxx' a, 123 b) Fehler Gibt einen Fehler zurück, da es mehr als eine Spalte gibt.
(SELECT AS STRUCT 'xxx' a, 123 b) STRUCT  
(SELECT AS STRUCT 'xxx' a) STRUCT  
ARRAY ARRAY(SELECT COUNT(*) FROM t.int_array) ARRAY der Größe 1  
ARRAY(SELECT x FROM t) ARRAY  
ARRAY(SELECT 5 a, COUNT(*) b FROM t.int_array) Fehler Gibt einen Fehler zurück, da es mehr als eine Spalte gibt.
ARRAY(SELECT AS STRUCT 5 a, COUNT(*) b FROM t.int_array) ARRAY  
ARRAY(SELECT AS STRUCT i FROM t.int_array i) ARRAY Erstellt ein ARRAY von STRUCTs mit einem Feld.
ARRAY(SELECT AS STRUCT 1 x, 2, 3 x) ARRAY Gibt einen ARRAY von STRUCTs mit anonymen oder doppelten Feldern zurück.
ARRAY(SELECT AS TypeName SUM(x) a, SUM(y) b, SUM(z) c from t) array<TypeName> Auswahl eines benannten Typs. Nimmt an, dass TypeName ein STRUCT-Typ mit den Feldern a, b, c ist.
STRUCT (SELECT AS STRUCT 1 x, 2, 3 x) STRUCT Konstruiert einen STRUCT mit anonymen oder doppelten Feldern.
EXISTS EXISTS(SELECT x,y,z FROM table WHERE y=z) BOOL  
NOT EXISTS(SELECT x,y,z FROM table WHERE y=z) BOOL  
IN x IN (SELECT y FROM table WHERE z) BOOL  
x NOT IN (SELECT y FROM table WHERE z) BOOL