Benutzerdefinierte Funktionen

Mit einer benutzerdefinierten Funktion (User-defined Function, UDF) können Sie eine Funktion mit einem SQL-Ausdruck oder JavaScript-Code erstellen. Eine UDF akzeptiert Eingabespalten, führt Aktionen für die Eingabe aus und gibt das Ergebnis dieser Aktionen als Wert zurück.

UDFs können als persistent oder temporär definiert werden. Persistente UDFs können Sie für mehrere Abfragen verwenden, temporäre UDFs jedoch nur für eine einzelne Abfrage.

Verwenden Sie zum Erstellen einer UDF die Anweisung CREATE FUNCTION. Verwenden Sie die Anweisung DROP FUNCTION, um eine persistente benutzerdefinierte Funktion zu löschen. Temporäre UDFs laufen sofort ab, wenn die Abfrage abgeschlossen ist. Die Anweisung DROP FUNCTION wird nur für temporäre UDFs in Abfragen mit mehreren Anweisungen und Prozeduren unterstützt.

Informationen zu UDFs in Legacy-SQL finden Sie unter Benutzerdefinierte Funktionen in Legacy-SQL.

SQL-UDFs

Im folgenden Beispiel wird eine temporäre SQL-UDF mit dem Namen AddFourAndDivide erstellt und die UDF aus einer SELECT-Anweisung aufgerufen:

CREATE TEMP FUNCTION AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);

SELECT
  val, AddFourAndDivide(val, 2)
FROM
  UNNEST([2,3,5,8]) AS val;

Dieses Beispiel liefert folgende Ausgabe:

+-----+-----+
| val | f0_ |
+-----+-----+
|   2 | 3.0 |
|   3 | 3.5 |
|   5 | 4.5 |
|   8 | 6.0 |
+-----+-----+

Das nächste Beispiel erstellt dieselbe Funktion wie eine persistente UDF:

CREATE FUNCTION mydataset.AddFourAndDivide(x INT64, y INT64)
RETURNS FLOAT64
AS (
  (x + 4) / y
);

Da diese UDF persistent ist, müssen Sie ein Dataset für die Funktion angeben (in diesem Beispiel mydataset). Nachdem Sie die Anweisung CREATE FUNCTION ausgeführt haben, können Sie die Funktion aus einer Abfrage aufrufen:

SELECT
  val, mydataset.AddFourAndDivide(val, 2)
FROM
  UNNEST([2,3,5,8,12]) AS val;

Vorlagen für SQL-UDF-Parameter

Ein Parameter mit dem Typ ANY TYPE kann bei einem Funktionsaufruf mit mehr als einem Argumenttyp übereinstimmen.

  • Wenn mehrere Parameter den Typ ANY TYPE haben, erzwingt BigQuery keine Typbeziehung zwischen diesen Argumenten.
  • Der Rückgabetyp der Funktion darf nicht ANY TYPE sein. Er muss entweder ausgelassen werden, d. h. automatisch anhand von sql_expression ermittelt werden, oder ein expliziter Typ sein.
  • Werden der Funktion Argumente mit Typen übergeben, die nicht mit der Funktionsdefinition kompatibel sind, wird zum Aufrufzeitpunkt ein Fehler ausgelöst.

Das folgende Beispiel zeigt eine SQL-UDF, die einen Vorlagenparameter verwendet.

CREATE TEMP FUNCTION addFourAndDivideAny(x ANY TYPE,