FirebirdSQL logo

Beispiel für BASE64_DECODE

select cast(base64_decode('VGVzdCBiYXNlNjQ=') as varchar(12))
from rdb$database;

CAST
============
Test base64

BASE64_ENCODE()

Verfügbar in

DSQL, PSQL

Ergebnistyp

VARCHAR CHARACTER SET ASCII oder BLOB SUB_TYPE TEXT CHARACTER SET ASCII

Syntax
BASE64_ENCODE (binary_data)
Table 1. BASE64_ENCODE-Funktionsparameter
Parameter Beschreibung

binary_data

Binäre Daten (oder anderweitig in Binär umwandelbar) zum Codieren

BASE64_ENCODE codiert binary_data mit base64 und gibt den codierten Wert je nach Eingabe als VARCHAR CHARACTER SET ASCII oder BLOB SUB_TYPE TEXT CHARACTER SET ASCII zurück.Der zurückgegebene Wert wird mit ‘=’ aufgefüllt, sodass seine Länge ein Vielfaches von 4 ist.

Wenn die Eingabe nicht 'BLOB' ist, wird die Länge des resultierenden Typs berechnet als 'type_length * 4 / 3', aufgerundet auf ein Vielfaches von vier, wobei type_length die maximale Länge in Bytes des Eingabetyps ist.Überschreitet diese Länge die maximale Länge von VARCHAR, gibt die Funktion ein BLOB zurück.

docnext count = 62

Beispiel für BASE64_ENCODE

select base64_encode('Test base64')
from rdb$database;

BASE64_ENCODE
================
VGVzdCBiYXNlNjQ=

BIT_LENGTH()

Verfügbar in

DSQL, PSQL

Ergebnistyp

INTEGER

Syntax
BIT_LENGTH (string)
Table 1. BIT_LENGTH-Funktionsparameter
Parameter Beschreibung

string

Ein Ausdruck eines String-Typs

Gibt die Länge des Eingabestrings in Bits an.Bei Mehrbyte-Zeichensätzen kann dies kleiner sein als die Anzahl der Zeichen mal 8 mal die “formale” Anzahl von Bytes pro Zeichen wie in RDB$CHARACTER_SETS gefunden.

Note

Bei Argumenten vom Typ CHAR berücksichtigt diese Funktion die gesamte formale Stringlänge (d.h. die deklarierte Länge eines Feldes oder einer Variablen).Wenn Sie die “logische” Bitlänge erhalten möchten, ohne die abschließenden Leerzeichen zu zählen, rechts-TRIM das Argument vor der Übergabe an BIT_LENGTH.

BLOB-Unterstützung

Seit Firebird 2.1 unterstützt diese Funktion vollständig Text-BLOBs jeder Länge und jedes beliebigen Zeichensatzes.

BIT_LENGTH-Beispiele

select bit_length('Hello!') from rdb$database
-- Ergebnis 48

select bit_length(_iso8859_1 'Grüß di!') from rdb$database
-- Ergebnis 64: ü und ß belegen in ISO8859_1 jeweils ein Byte

select bit_length
  (cast (_iso8859_1 'Grüß di!' as varchar(24) character set utf8))
from rdb$database
-- Ergebnis 80: ü und ß belegen in ISO8859_1 jeweils ein Byte

select bit_length
  (cast (_iso8859_1 'Grüß di!' as char(24) character set utf8))
from rdb$database
-- Ergebnis 208: alle 24 CHAR-Positionen zählen, und zwei davon sind 16-Bit

BLOB_APPEND()

Verfügbar in

DSQL, PSQL

Hinzugefügt in Version

4.0.2

Rückgabetyp

BLOB

Syntax
BLOB_APPEND(expr1, expr2 [, exprN ... ])
Table 1. BLOB_APPEND-Funktionsparameter
Parameter Beschreibung

exprN

Ein Ausdruck eines Typs, der in BLOB umwandelbar ist

Die BLOB_APPEND-Funktion verkettet Blobs, ohne zwischenzeitliche BLOBs zu erstellen, wodurch übermäßiger Speicherverbrauch und Wachstum der Datenbankdatei vermieden werden.Die Funktion BLOB_APPEND nimmt zwei oder mehr Argumente und fügt sie zu einem BLOB hinzu, der für eine weitere Modifikation durch einen nachfolgenden Aufruf von BLOB_APPEND offen bleibt.

Das resultierende BLOB wird zum Schreiben offen gelassen, anstatt geschlossen zu werden, wenn die Funktion zurückkehrt.Mit anderen Worten, das BLOB kann beliebig oft angehängt werden.Die Engine markiert das von BLOB_APPEND zurückgegebene BLOB mit einem internen Flag BLB_close_on_read und schließt es bei Bedarf automatisch.

Das erste Argument bestimmt das Verhalten der Funktion:

  1. NULL: neues, leeres BLOB SUB_TYPE TEXT CHARACTER SET NONE wird erstellt

    In Firebird 5.0 (und — vielleicht — Firebird 4.0.3) wird dies geändert, um den Verbindungszeichensatz anstelle von NONE zu verwenden.

  2. permanentes BLOB (aus einer Tabelle) oder temporäres BLOB, das bereits geschlossen war: neues BLOB SUB_TYPE TEXT wird erstellt, gefüllt mit dem Inhalt des ursprünglichen BLOB.Wenn das ursprüngliche BLOB SUB_TYPE TEXT ist, wird dessen Zeichensatz verwendet, andernfalls der Zeichensatz OCTETS.

    In Firebird 5.0 (und -– vielleicht -– Firebird 4.0.3) wird sich dies dahingehend ändern, dass der Untertyp des anfänglichen BLOB verwendet wird.

  3. temporäres, nicht geschlossenes BLOB mit dem BLB_close_on_read-Flag (z. B. erstellt durch einen anderen Aufruf von BLOB_APPEND): unverändert verwendet, verbleibende Argumente werden an dieses BLOB angehängt

  4. andere Datentypen: ein neuer BLOB SUB_TYPE TEXT wird erstellt, gefüllt mit dem ursprünglichen Argument, das in einen String umgewandelt wurde.Wenn der Originalwert ein Zeichentyp ist, wird dessen Zeichensatz verwendet (bei String-Literalen der Verbindungszeichensatz), ansonsten Zeichensatz NONE (wird in Firebird 5.0 und — vielleicht — Firebird 4.0.3 geändert, um den Verbindungszeichensatz zu verwenden).

Andere Argumente können von beliebigem Typ sein.Für sie ist folgendes Verhalten definiert:

  1. NULLs werden ignoriert (verhält sich wie ein leerer String)

  2. BLOBs werden ggf. in den Zeichensatz des ersten Arguments transliteriert und ihr Inhalt an das Ergebnis angehängt

  3. andere Datentypen werden (wie üblich) in Strings umgewandelt und an das Ergebnis angehängt

Die Funktion BLOB_APPEND gibt einen vorübergehend nicht geschlossenen BLOB mit dem Flag BLB_close_on_read zurück.Wenn das erste Argument ein solches temporäres, nicht geschlossenes BLOB ist (z. B. durch einen vorherigen Aufruf von BLOB_APPEND erstellt), wird es so verwendet, wie es ist, andernfalls wird ein neues BLOB erstellt.Daher führt eine Reihe von Operationen wie blob = BLOB_APPEND (blob, …​) zur Erstellung von höchstens einem BLOB (es sei denn, Sie versuchen, ein BLOB an sich selbst anzuhängen).Dieses Blob wird automatisch von der Engine geschlossen, wenn der Client es liest, es einer Tabelle zuweist oder es in anderen Ausdrücken verwendet, die das Lesen des Inhalts erfordern.

Warning
Wichtige Einschränkungen für BLOB_APPEND
  1. Das NULL-Verhalten von BLOB_APPEND unterscheidet sich von der normalen Verkettung (unter Verwendung von ||).Das Auftreten von NULL verhält sich so, als ob ein leerer String verwendet wurde.Mit anderen Worten,"NULL wird effektiv ignoriert.

    Bei der normalen Verkettung führt die Verkettung mit NULL zu NULL.

  2. Das Ergebnis ist immer ein BLOB SUB_TYPE TEXT.

    Dies wurde als Fehler identifiziert, der in Firebird 5.0 (und –- vielleicht –- Firebird 4.0.3) behoben wird, siehe Issue #7256.

Note

Der eines Blobs auf NULL mittels IS [NOT] NULL liest das Blob nicht ein. Deshalb wird ein temporäres Blob mit dem Flag BLB_close_on_read nach einem solchen Test nicht geschlossen.

Tip

Verwenden Sie die Funktionen LIST oder BLOB_APPEND, um Blobs zu verketten.Dadurch werden der Arbeitsspeicherverbrauch und die Datenträger-E/A reduziert und außerdem das Datenbankwachstum aufgrund der Erstellung vieler temporärer Blobs bei Verwendung des Verkettungsoperators verhindert.

BLOB_APPEND-Beispiele

execute block
returns (b blob sub_type text)
as
begin
  -- creates a new temporary not closed BLOB
  -- and writes the string from the 2nd argument into it
  b = blob_append(null, 'Hello ');
  -- adds two strings to the temporary BLOB without closing it
  b = blob_append(b, 'World', '!');
  -- comparing a BLOB with a string will close it, because the BLOB needs to be read
  if (b = 'Hello World!') then
  begin
  -- ...
  end
  -- creates a temporary closed BLOB by adding a string to it
  b = b || 'Close';
  suspend;
end

CHAR_LENGTH(), CHARACTER_LENGTH()

Verfügbar in

DSQL, PSQL

Ergebnistyp

INTEGER

Syntax
  CHAR_LENGTH (string)
| CHARACTER_LENGTH (string)
Table 1. CHAR[ACTER]_LENGTH-Funktionsparameter
Parameter Beschreibung

string

Ein Ausdruck eines String-Typs

Gibt die Länge des Eingabestrings in Zeichen an.

Note
  • Bei Argumenten vom Typ CHAR liefert diese Funktion die formale Stringlänge (d.h. die deklarierte Länge eines Feldes oder einer Variablen).Wenn Sie die “logische” Länge erhalten möchten, ohne die abschließenden Leerzeichen zu zählen, rechts-TRIM das Argument vor der Übergabe an CHAR[ACTER]_LENGTH.

  • BLOB-Unterstützung: Seit Firebird 2.1 unterstützt diese Funktion vollständig Text-BLOBs jeder Länge und jedes beliebigen Zeichensatzes.

CHAR_LENGTH-Beispiele

select char_length('Hello!') from rdb$database
-- Ergebnis 6

select char_length(_iso8859_1 'Grüß di!') from rdb$database
-- Ergebnis 8

select char_length
  (cast (_iso8859_1 'Grüß di!' as varchar(24) character set utf8))
from rdb$database
-- Ergebnis 8; dass ü und ß jeweils zwei Bytes belegen ist irrelevant

select char_length
  (cast (_iso8859_1 'Grüß di!' as char(24) character set utf8))
from rdb$database
-- Ergebnis 24: alle 24 CHAR-Positionen zählen

CRYPT_HASH()

Verfügbar in

DSQL, PSQL

Rückgabetyp

VARBINARY

Syntax
CRYPT_HASH (value USING <hash>)

<hash> ::= MD5 | SHA1 | SHA256 | SHA512
Table 1. CRYPT_HASH-Funktionsparameter
Parameter Beschreibung

value

Ausdruck von Werten jeglicher Art;Nicht-String- oder Nicht-Binär-Typen werden in Strings konvertiert

hash

Anzuwendender kryptografischer Hash-Algorithmus

CRYPT_HASH gibt einen kryptografischen Hash zurück, der aus dem Eingabeargument mit dem angegebenen Algorithmus berechnet wurde.Wenn das Eingabeargument kein String- oder Binärtyp ist, wird es vor dem Hashing in einen String konvertiert.

Diese Funktion gibt ein VARBINARY mit der Länge abhängig vom angegebenen Algorithmus zurück.

Note
  • Die Algorithmen 'MD5' und 'SHA1' werden aus Sicherheitsgründen nicht empfohlen, da bekannte Angriffe Hash-Kollisionen erzeugen.Diese beiden Algorithmen werden nur aus Gründen der Abwärtskompatibilität bereitgestellt.

  • Beim Hashing von String- oder Binärwerten ist es wichtig, die Auswirkungen von abschließenden Leerzeichen (Leerzeichen oder NULs) zu berücksichtigen.Der Wert 'ab' in einem CHAR(5) (3 nachgestellte Leerzeichen) hat einen anderen Hash als wenn er in einem VARCHAR(5) (keine nachgestellten Leerzeichen) oder CHAR(6) gespeichert ist ( 4 nachgestellte Leerzeichen).

    Um dies zu vermeiden, stellen Sie sicher, dass Sie immer einen Datentyp mit variabler Länge oder denselben Datentyp mit fester Länge verwenden oder Werte vor dem Hashing normalisieren, zum Beispiel mit TRIM(TRAILING FROM value) .

Beispiele für CRYPT_HASH

Hashing x mit dem SHA512-Algorithmus
select crypt_hash(x using sha512) from y;

HASH()

Verfügbar in

DSQL, PSQL

Ergebnistyp

INTEGER,BIGINT

Syntax
HASH (value [USING <hash>])

<hash> ::= CRC32
Table 1. HASH-Funktionsparameter
Parameter Beschreibung

value

Ausdruck von Werten jeglicher Art;Nicht-String- oder Nicht-Binär-Typen werden in Strings konvertiert

hash

Anzuwendender nicht-kryptografischer Hash-Algorithmus

HASH gibt einen Hash-Wert für das Eingabeargument zurück.Wenn das Eingabeargument kein String- oder Binärtyp ist, wird es vor dem Hashing in einen String konvertiert.

Die optionale USING-Klausel gibt den anzuwendenden nicht-kryptografischen Hash-Algorithmus an.Wenn die USING-Klausel fehlt, wird der Legacy-PJW-Algorithmus angewendet;dies ist identisch mit dem Verhalten in früheren Firebird-Versionen.

Diese Funktion unterstützt vollständig Text-BLOBs jeder Länge und jedes beliebigen Zeichensatzes.

Unterstützte Algorithmen
not specified

Wenn kein Algorithmus angegeben ist, wendet Firebird die 64-Bit-Variante der nicht-kryptografischen PJW-Hash-Funktion (auch bekannt als ELF64) an.Dies ist ein sehr schneller Algorithmus für allgemeine Zwecke (Hash-Tabellen usw.), aber seine Kollisionsqualität ist nicht optimal.Andere Hashfunktionen – die explizit in der USING-Klausel angegeben sind, oder kryptografische Hashes durch [fblangref40-scalarfuncs-crypthash-de] – sollten für zuverlässigeres Hashing verwendet werden.

Die Funktion HASH gibt BIGINT für diesen Algorithmus zurück

CRC32

Mit CRC32 wendet Firebird den CRC32-Algorithmus unter Verwendung des Polynoms 0x04C11DB7 an.

Die Funktion HASH gibt INTEGER für diesen Algorithmus zurück.

Beispiele für HASH

  1. Hashing x mit dem CRC32-Algorithmus

    select hash(x using crc32) from y;
  2. Hashing x mit dem Legacy-PJW-Algorithmus

    select hash(x) from y;

Datums- und Zeitfunktionen

DATEADD()

Verfügbar in

DSQL, PSQL

Ergebnistyp

DATE, TIME oder TIMESTAMP

Syntax
DATEADD (<args>)

<args> ::=
    <amount> <unit> TO <datetime>
  | <unit>, <amount>, <datetime>

<amount> ::= ein ganzzahliger Ausdruck (negativ zum Subtrahieren)
<unit> ::=
    YEAR | MONTH | WEEK | DAY
  | HOUR | MINUTE | SECOND | MILLISECOND
<datetime> ::= ein DATE-, TIME- oder TIMESTAMP-Ausdruck
Table 1. DATEADD-Funktionsparameter
Parameter Beschreibung

amount

Ein ganzzahliger Ausdruck vom Typ SMALLINT, INTEGER oder BIGINT.Für die Einheit MILLISECOND ist der Typ NUMERIC(18, 1).Ein negativer Wert wird abgezogen.

unit

Datum/Uhrzeit-Einheit

datetime

Ein Ausdruck vom Typ DATE, TIME oder TIMESTAMP

Addiert die angegebene Anzahl von Jahren, Monaten, Wochen, Tagen, Stunden, Minuten, Sekunden oder Millisekunden zu einem Datums-/Uhrzeitwert.

  • Der Ergebnistyp wird durch das dritte Argument bestimmt.

  • Mit den Argumenten TIMESTAMP und DATE können alle Einheiten verwendet werden.

  • Bei TIME-Argumenten können nur HOUR, MINUTE, SECOND und MILLISECOND verwendet werden.

Beispiele of DATEADD

dateadd (28 day to current_date)
dateadd (-6 hour to current_time)
dateadd (month, 9, DateOfConception)
dateadd (-38 week to DateOfBirth)
dateadd (minute, 90, cast('now' as time))
dateadd (? year to date '11-Sep-1973')
select
  cast(dateadd(-1 * extract(millisecond from ts) millisecond to ts) as varchar(30)) as t,
  extract(millisecond from ts) as ms
from (
  select timestamp '2014-06-09 13:50:17.4971' as ts
  from rdb$database
) a
T                        MS
------------------------ ------
2014-06-09 13:50:17.0000  497.1

DATEDIFF()

Verfügbar in

DSQL, PSQL

Ergebnistyp

BIGINT, oder — seit Firebird 4.0.1 — NUMERIC(18,1) für MILLISECOND

Syntax
DATEDIFF (<args>)

<args> ::=
    <unit> FROM <moment1> TO <moment2>
  | <unit>, <moment1>, <moment2>

<unit> ::=
    YEAR | MONTH | WEEK | DAY
  | HOUR | MINUTE | SECOND | MILLISECOND
<momentN> ::= ein DATE-, TIME- oder TIMESTAMP-Ausdruck
Table 1. DATEDIFF-Funktionsparameter
Parameter Beschreibung

unit

Datum/Uhrzeit-Einheit

moment1

Ein Ausdruck vom Typ DATE, TIME oder TIMESTAMP

moment2

Ein Ausdruck vom Typ DATE, TIME oder TIMESTAMP

Gibt die Anzahl der Jahre, Monate, Wochen, Tage, Stunden, Minuten, Sekunden oder Millisekunden zurück, die zwischen zwei Datums-/Uhrzeitwerten verstrichen sind.(Die Einheit WOCHE ist neu in 2.5.)

  • Die Argumente DATE und TIMESTAMP können kombiniert werden.Andere Mischungen sind nicht erlaubt.

  • Mit den Argumenten TIMESTAMP und DATE können alle Einheiten verwendet werden.(Vor Firebird 2.5 waren Einheiten, die kleiner als DAY waren, für DATEs nicht zulässig.)

  • Bei TIME-Argumenten können nur HOUR, MINUTE, SECOND und MILLISECOND verwendet werden.

Berechnung
  • DATEDIFF betrachtet keine kleineren Einheiten als die im ersten Argument angegebene.Als Ergebnis,

    • datediff (Jahr, Datum '1-Jan-2009', Datum '31-Dez-2009') gibt 0 zurück, aber

    • `datediff (Jahr, Datum '31-Dez-2009', Datum '1-Jan-2010')' gibt 1 zurück

  • Es betrachtet jedoch alle größeren Einheiten. So:

    • `datediff (Tag, Datum '26-Jun-1908', Datum '11-Sep-1973')' gibt 23818 zurück

  • Ein negativer Ergebniswert bedeutet, dass moment2 vor moment1 liegt.

DATEDIFF-Beispiele

datediff (hour from current_timestamp to timestamp '12-Jun-2059 06:00')
datediff (minute from time '0:00' to current_time)
datediff (month, current_date, date '1-1-1900')
datediff (day from current_date to cast(? as date))

EXTRACT()

Verfügbar in

DSQL, ESQL, PSQL

Ergebnistyp

SMALLINT or NUMERIC

Syntax
EXTRACT (<part> FROM <datetime>)

<part> ::=
    YEAR | MONTH | WEEK
  | DAY | WEEKDAY | YEARDAY
  | HOUR | MINUTE | SECOND | MILLISECOND
  | TIMEZONE_HOUR | TIMEZONE_MINUTE
<datetime> ::= ein DATE-, TIME- oder TIMESTAMP-Ausdruck
Table 1. EXTRACT-Funktionsparameter
Parameter Beschreibung

part

Datum/Uhrzeit-Einheit

datetime

Ein Ausdruck vom Typ DATE, TIME oder TIMESTAMP

Extrahiert ein Element aus einem DATE, TIME oder TIMESTAMP Ausdruck und gibt es zurück.

Zurückgegebene Datentypen und Bereiche

Die zurückgegebenen Datentypen und möglichen Bereiche sind in der folgenden Tabelle aufgeführt.Wenn Sie versuchen, einen Teil zu extrahieren, der nicht im Datum/Uhrzeit-Argument vorhanden ist (z. B. SECOND aus einem DATE oder YEAR aus einer TIME), tritt ein Fehler auf.

Table 1. Arten und Bereiche von EXTRACT-Ergebnissen
Teil Typ Bereich Anmerkung

YEAR

SMALLINT

1-9999

 

MONTH

SMALLINT

1-12

 

WEEK

SMALLINT

1-53

 

DAY

SMALLINT

1-31

 

WEEKDAY

SMALLINT

0-6

0 = Sonntag

YEARDAY

SMALLINT

0-365

0 = 1. Januar

HOUR

SMALLINT

0-23

 

MINUTE

SMALLINT

0-59

 

SECOND

NUMERIC(9,4)

0.0000-59.9999

beinhaltet Millisekunden als Bruch

MILLISECOND

NUMERIC(9,1)

0.0-999.9

fehlerhaft in 2.1, 2.1.1

TIMEZONE_HOUR

SMALLINT

-23 - +23

 

TIMEZONE_MINUTE

SMALLINT

-59 - +59

 

MILLISECOND

Firebird 2.1 und höher unterstützen die Extraktion der Millisekunde aus einer TIME oder TIMESTAMP.Der zurückgegebene Datentyp ist NUMERIC(9,1).

Note

Wenn Sie die Millisekunde aus [fblangref40-contextvars-current-time-de] extrahieren, beachten Sie, dass diese Variable standardmäßig auf die Sekundengenauigkeit eingestellt ist, sodass das Ergebnis immer 0 ist.Extrahieren Sie aus CURRENT_TIME(3) oder [fblangref40-contextvars-current-timestamp-de], um eine Genauigkeit in Millisekunden zu erhalten.

WEEK

Firebird 2.1 und höher unterstützen die Extraktion der ISO-8601-Wochennummer aus einem "DATE" oder "TIMESTAMP".ISO-8601-Wochen beginnen an einem Montag und haben immer die vollen sieben Tage.Woche 1 ist die erste Woche mit einem Großteil (mindestens 4) der Tage im neuen Jahr.Die ersten 1-3 Tage des Jahres können zur letzten Woche (52 oder 53) des Vorjahres gehören.Ebenso können die letzten 1-3 Tage eines Jahres zur ersten Woche des Folgejahres gehören.

Caution

Seien Sie vorsichtig, wenn Sie die Ergebnisse von WOCHE und JAHR kombinieren.Zum Beispiel liegt der 30. Dezember 2008 in Woche 1 von 2009, also gibt extract(week from date '40 Dec 2008')' 1 zurück.Das Extrahieren von `YEAR ergibt jedoch immer das Kalenderjahr, das 2008 ist.In diesem Fall sind "WOCHE" und "JAHR" uneins.Das gleiche passiert, wenn die ersten Januartage zur letzten Woche des Vorjahres gehören.

Bitte beachten Sie auch, dass WEEKDAY nicht ISO-8601-kompatibel ist: Es gibt 0 für Sonntag zurück, während ISO-8601 7 angibt.

FIRST_DAY()

Verfügbar in

DSQL, PSQL

Rückgabetyp

DATE, TIMESTAMP (mit oder ohne Zeitzone)

Syntax
FIRST_DAY(OF <period> FROM date_or_timestamp)

<period> ::= YEAR | MONTH | WEEK
Table 1. FIRST_DAY-Funktionsparameter
Parameter Beschreibung

date_or_timestamp

Ausdruck vom Typ DATE, TIMESTAMP WITHOUT TIME ZONE oder TIMESTAMP WITH TIME ZONE

FIRST_DAY gibt ein Datum oder einen Zeitstempel (gleich dem Typ von date_or_timestamp) mit dem ersten Tag des Jahres, des Monats oder der Woche eines gegebenen Datums- oder Zeitstempelwerts zurück.

Note
  • Der erste Tag der Woche gilt als Sonntag, nach den gleichen Regeln wie für [fblangref40-scalarfuncs-extract-de] mit WEEKDAY.

  • Wenn ein Zeitstempel übergeben wird, behält der Rückgabewert den Zeitteil bei.

Beispiel für FIRST_DAY

select first_day(of month from current_date) from rdb$database;
select first_day(of year from current_timestamp) from rdb$database;
select first_day(of week from date '2017-11-01') from rdb$database;

LAST_DAY()

Verfügbar in

DSQL, PSQL

Rückgabetyp

DATE, TIMESTAMP (mit oder ohne Zeitzone)

Syntax
LAST_DAY(OF <period> FROM date_or_timestamp)

<period> ::= YEAR | MONTH | WEEK
Table 1. LAST_DAY-Funktionsparameter
Parameter Beschreibung

date_or_timestamp

Ausdruck vom Typ DATE, TIMESTAMP WITHOUT TIME ZONE oder TIMESTAMP WITH TIME ZONE

LAST_DAY gibt ein Datum oder einen Zeitstempel (gleich dem Typ von date_or_timestamp) mit dem letzten Tag des Jahres, des Monats oder der Woche eines gegebenen Datums- oder Zeitstempelwerts zurück.

Note
  • Der letzte Tag der Woche gilt als Samstag, nach den gleichen Regeln wie für [fblangref40-scalarfuncs-extract-de] mit WEEKDAY.

  • Wenn ein Zeitstempel übergeben wird, behält der Rückgabewert den Zeitteil bei.

Beispiele für LAST_DAY

select last_day(of month from current_date) from rdb$database;
select last_day(of year from current_timestamp) from rdb$database;
select last_day(of week from date '2017-11-01') from rdb$database;

Typ-Casting-Funktionen

CAST()

Verfügbar in

DSQL, ESQL, PSQL

Ergebnistyp

Wie von target_type angegeben

Syntax
CAST (<expression> AS <target_type>)

<target_type> ::= <domain_or_non_array_type> | <array_datatype>

<domain_or_non_array_type> ::=
  !! Siehe auch Syntax für skalare Datentypen !!

<array_datatype> ::=
  !! Siehe auch Syntax der Array-Datentypen !!
Table 1. CAST-Funktionsparameter
Parameter Beschreibung

expression

SQL-Ausdruck

sql_datatype

SQL-Datentyp

CAST wandelt einen Ausdruck in den gewünschten Datentyp oder die gewünschte Domäne um.Wenn die Konvertierung nicht möglich ist, wird ein Fehler ausgegeben.

Casting BLOBs

Erfolgreiches Casting zu und von BLOBs ist seit Firebird 2.1 möglich.

Syntax für “Kurzschreibweise”

Alternative Syntax, die nur unterstützt wird, wenn ein Stringliteral in ein DATE, TIME oder TIMESTAMP umgewandelt wird:

datatype 'date/timestring'

Diese Syntax war bereits in InterBase verfügbar, wurde jedoch nie richtig dokumentiert.Im SQL-Standard heißt diese Funktion “datetime literals”.

Note

Seit Firebird 4.0 ist die Verwendung von 'NOW', 'YESTERDAY' und 'TOMORROW' in der Kurzform nicht mehr erlaubt; nur Literale, die einen festen Zeitpunkt definieren, werden unterstützt.

Zulässige Typumwandlungen

Die folgende Tabelle zeigt die mit CAST möglichen Typkonvertierungen.

Table 1. Mögliche Type-Castings mit CAST
Von Nach

Numerische Typen

Numerische Typen
[VAR]CHAR
BLOB

[VAR]CHAR
BLOB

[VAR]CHAR
BLOB
Numerische Typen
DATE
TIME
TIMESTAMP

DATE
TIME

[VAR]CHAR
BLOB
TIMESTAMP

TIMESTAMP

[VAR]CHAR
BLOB
DATE
TIME

Denken Sie daran, dass manchmal Informationen verloren gehen, zum Beispiel wenn Sie einen TIMESTAMP in ein DATE umwandeln.Auch die Tatsache, dass Typen CAST-kompatibel sind, ist noch keine Garantie dafür, dass eine Konvertierung erfolgreich ist.“CAST(123456789 as SMALLINT)” führt definitiv zu einem Fehler, ebenso wie “CAST('Judgement Day' as DATE)”.

Casting-Parameter

Seit Firebird 2.0 können Sie Anweisungsparameter in einen Datentyp umwandeln:

cast (? as integer)

Dies gibt Ihnen die Kontrolle über den Typ des Parameters, der von der Engine eingerichtet wird.Bitte beachten Sie, dass Sie bei Anweisungsparametern immer eine vollständige Syntaxumwandlung benötigen – Kurzformumwandlungen werden nicht unterstützt.

Casting in eine Domain oder deren Typ

Firebird 2.1 und höher unterstützen das Casting in eine Domäne oder deren Basistyp.Beim Casting in eine Domain müssen alle für die Domain deklarierten Constraints (NOT NULL und/oder CHECK) erfüllt sein, sonst schlägt das Casting fehl.Bitte beachten Sie, dass ein CHECK erfolgreich ist, wenn es als TRUE oder NULL ausgewertet wird!Also folgende Aussagen gegeben:

create domain quint as int check (value >= 5000);
select cast (2000 as quint) from rdb$database;     -- (1)
select cast (8000 as quint) from rdb$database;     -- (2)
select cast (null as quint) from rdb$database;     -- (3)

nur die Besetzungsnummer 1 führt zu einem Fehler.

Wenn der Modifikator TYPE OF verwendet wird, wird der Ausdruck in den Basistyp der Domäne umgewandelt, wobei alle Einschränkungen ignoriert werden.Mit der oben definierten Domain 'quint' sind die folgenden beiden Casts äquivalent und werden beide erfolgreich sein:

select cast (2000 as type of quint) from rdb$database;
select cast (2000 as int) from rdb$database;

Wenn TYPE OF mit einem (VAR)CHAR-Typ verwendet wird, werden sein Zeichensatz und seine Kollatierung beibehalten:

create domain iso20 varchar(20) character set iso8859_1;
create domain dunl20 varchar(20) character set iso8859_1 collate du_nl;
create table zinnen (zin varchar(20));
commit;
insert into zinnen values ('Deze');
insert into zinnen values ('Die');
insert into zinnen values ('die');
insert into zinnen values ('deze');

select cast(zin as type of iso20) from zinnen order by 1;
-- Ergebnis Deze -> Die -> deze -> die

select cast(zin as type of dunl20) from zinnen order by 1;
-- Ergebnis deze -> Deze -> die -> Die
Warning

Wenn die Definition einer Domain geändert wird, können bestehende CASTs für diese Domain oder ihr Typ ungültig werden.Wenn diese CASTs in PSQL-Modulen vorkommen, kann ihre Ungültigkeit erkannt werden.Siehe Hinweis Das RDB$VALID_BLR-Feld in Anhang A.

Umwandeln in den Typ einer Spalte

In Firebird 2.5 und höher ist es möglich, Ausdrücke in den Typ einer vorhandenen Tabelle oder Ansichtsspalte umzuwandeln.Nur der Typ selbst wird verwendet;bei String-Typen umfasst dies den Zeichensatz, aber nicht die Kollatierung.Einschränkungen und Standardwerte der Quellspalte werden nicht angewendet.

create table ttt (
  s varchar(40) character set utf8 collate unicode_ci_ai
);
commit;

select cast ('Jag har många vänner' as type of column ttt.s)
from rdb$database;
Warning
Warnungen

Wenn die Definition einer Spalte geändert wird, können vorhandene CASTs für den Typ dieser Spalte ungültig werden.Wenn diese CASTs in PSQL-Modulen vorkommen, kann ihre Ungültigkeit erkannt werden.Siehe den Hinweis Das RDB$VALID_BLR-Feld in Anhang A.

Cast-Beispiele

Ein Vollsyntax Cast:

select cast ('12' || '-June-' || '1959' as date) from rdb$database

Eine Kurzschreibweise zur Umwandlung von String zu Datum:

update People set AgeCat = 'Old'
  where BirthDate < date '1-Jan-1943'

Beachten Sie, dass Sie sogar die Kurzform aus dem obigen Beispiel weglassen können, da die Engine aus dem Kontext (Vergleich mit einem DATE-Feld) versteht, wie die Zeichenfolge zu interpretieren ist:

update People set AgeCat = 'Old'
  where BirthDate < '1-Jan-1943'

Jedoch ist dies nicht immer möglich.Der folgende Cast kann nicht weggelassen werden, sonst würde sich die Engine mit einer Ganzzahl wiederfinden, die von einer Zeichenfolge subtrahiert werden soll:

select cast('today' as date) - 7 from rdb$database

Bitweise Funktionen

BIN_AND()

Verfügbar in

DSQL, PSQL

Möglicher Namenskonflikt

YES → Details lesen

Ergebnistyp

SMALLINT, INTEGER oder BIGINT

Note

Das Ergebnis SMALLINT wird nur zurückgegeben, wenn alle Argumente explizit SMALLINTs oder NUMERIC(n, 0) mit n <= 4 sind;andernfalls geben kleine Ganzzahlen ein INTEGER-Ergebnis zurück.

Syntax
BIN_AND (number, number [, number ...])
Table 1. BIN_AND-Funktionsparameter
Parameter Beschreibung

number

Beliebige ganze Zahl (literal, smallint/integer/bigint, numerisch/dezimal mit Skalierung 0)

Gibt das Ergebnis der bitweisen AND-Operation für die Argumente zurück.

BIN_NOT()

Verfügbar in

DSQL, PSQL

Ergebnistyp

SMALLINT, INTEGER oder BIGINT

Note

Das Ergebnis SMALLINT wird nur zurückgegeben, wenn alle Argumente explizit SMALLINTs oder NUMERIC(n, 0) mit n <= 4 sind;andernfalls geben kleine Ganzzahlen ein INTEGER-Ergebnis zurück.

Syntax
BIN_NOT (number)
Table 1. BIN_NOT-Funktionsparameter
Parameter Beschreibung

number

Beliebige ganze Zahl (literal, smallint/integer/bigint, numerisch/dezimal mit Skala 0)

Gibt das Ergebnis der bitweisen NOT-Operation für das Argument zurück, d.h. das Einser-Komplement.

BIN_OR()

Verfügbar in

DSQL, PSQL

Möglicher Namenskonflikt

YES → Details lesen

Ergebnistyp

SMALLINT, INTEGER oder BIGINT

Note

Das Ergebnis SMALLINT wird nur zurückgegeben, wenn alle Argumente explizit SMALLINTs oder NUMERIC(n, 0) mit n <= 4 sind;andernfalls geben kleine Ganzzahlen ein INTEGER-Ergebnis zurück.

Syntax
BIN_OR (number, number [, number ...])
Table 1. BIN_OR-Funktionsparameter
Parameter Beschreibung

number

Beliebige ganze Zahl (literal, smallint/integer/bigint, numerisch/dezimal mit Skalierung 0)

Gibt das Ergebnis der bitweisen OR-Operation für die Argumente zurück.

BIN_SHL()

Verfügbar in

DSQL, PSQL

Ergebnistyp

BIGINT

Syntax
BIN_SHL (number, shift)
Table 1. BIN_SHL-Funktionsparameter
Parameter Beschreibung

number

Eine Zahl eines ganzzahligen Typs

shift

Die Anzahl der Bits, um die der Zahlenwert verschoben wird

Gibt das erste Argument bitweise linksverschoben um das zweite Argument zurück, d. h. a << b oder a·2b.

BIN_SHR()

Verfügbar in

DSQL, PSQL

Ergebnistyp

BIGINT

Syntax
BIN_SHR (number, shift)
Table 1. BIN_SHR-Funktionsparameter
Parameter Beschreibung

number

Eine Zahl eines ganzzahligen Typs

shift

Die Anzahl der Bits, um die der Zahlenwert verschoben wird

Gibt das erste Argument bitweise nach rechts verschoben um das zweite Argument zurück, d. h. a >> b oder a/2b.

  • Die ausgeführte Operation ist eine arithmetische Rechtsverschiebung (SAR), dh das Vorzeichen des ersten Operanden bleibt immer erhalten.

BIN_XOR()

Verfügbar in

DSQL, PSQL

Möglicher Namenskonflikt

YES → Details lesen

Ergebnistyp

SMALLINT, INTEGER oder BIGINT

Note

Das Ergebnis SMALLINT wird nur zurückgegeben, wenn alle Argumente explizit SMALLINTs oder NUMERIC(n, 0) mit n <= 4 sind;andernfalls geben kleine Ganzzahlen ein INTEGER-Ergebnis zurück.

Syntax
BIN_XOR (number, number [, number ...])
Table 1. BIN_XOR-Funktionsparameter
Parameter Beschreibung

number

Beliebige ganze Zahl (literal, smallint/integer/bigint, numerisch/dezimal mit Skalierung 0)

Gibt das Ergebnis der bitweisen XOR-Operation für die Argumente zurück.

UUID-Funktionen

CHAR_TO_UUID()

Verfügbar in

DSQL, PSQL

Ergebnistyp

BINARY(16)

Syntax
CHAR_TO_UUID (ascii_uuid)
Table 1. CHAR_TO_UUID-Funktionsparameter
Parameter Beschreibung

ascii_uuid

Eine 36-stellige Darstellung der UUID.‘-’ (Bindestrich) in den Positionen 9, 14, 19 und 24;gültige Hexadezimalziffern an beliebigen anderen Stellen, z.B. 'A0bF4E45-3029-2a44-D493-4998c9b439A3'

Konvertiert eine für Menschen lesbare 36-stellige UUID-Zeichenfolge in die entsprechende 16-Byte-UUID.

CHAR_TO_UUID-Beispiele

select char_to_uuid('A0bF4E45-3029-2a44-D493-4998c9b439A3') from rdb$database
-- Ergebnis A0BF4E4530292A44D4934998C9B439A3 (16-Byte String)

select char_to_uuid('A0bF4E45-3029-2A44-X493-4998c9b439A3') from rdb$database
-- Fehler: - Menschlich lesbares UUID-Argument für CHAR_TO_UUID
             muss eine Hex-Ziffer an Position 20 anstelle von "X (ASCII 88)" haben

GEN_UUID()

Verfügbar in

DSQL, PSQL

Ergebnistyp

BINARY(16)

Syntax
GEN_UUID ()

Gibt eine universell eindeutige ID als 16-Byte-Zeichenfolge zurück.

GEN_UUID-Beispiel

select gen_uuid() from rdb$database
-- Ergebnis e.g. 017347BFE212B2479C00FA4323B36320 (16-Byte String)

UUID_TO_CHAR()

Verfügbar in

DSQL, PSQL

Ergebnistyp

CHAR(36)

Syntax
UUID_TO_CHAR (uuid)
Table 1. UUID_TO_CHAR-Funktionsparameter
Parameter Beschreibung

uuid

16-Byte UUID

Konvertiert eine 16-Byte-UUID in ihre 36-stellige, für Menschen lesbare ASCII-Darstellung.

UUID_TO_CHAR-Beispiele

select uuid_to_char(x'876C45F4569B320DBCB4735AC3509E5F') from rdb$database
-- Ergebnis '876C45F4-569B-320D-BCB4-735AC3509E5F'

select uuid_to_char(gen_uuid()) from rdb$database
-- Ergebnis e.g. '680D946B-45FF-DB4E-B103-BB5711529B86'

select uuid_to_char('Firebird swings!') from rdb$database
-- Ergebnis '46697265-6269-7264-2073-77696E677321'

Funktionen für Sequenzen (Generatoren)

GEN_ID()

Verfügbar in

DSQL, ESQL, PSQL

Rückgabetyp

BIGINT — Dialect 2 und 3
INTEGER — Dialect 1

Syntax
GEN_ID (generator-name, step)
Table 1. GEN_ID-Funktionsparameter
Parameter Beschreibung

generator-name

Name eines vorhandenen Generators (Sequenz).Wenn er in doppelten Anführungszeichen mit einem Bezeichner definiert wurde, bei dem die Groß-/Kleinschreibung beachtet wird, muss er in derselben Form verwendet werden, es sei denn, der Name wird ausschließlich in Großbuchstaben geschrieben.

step

Ein ganzzahliger Ausdruck

Erhöht einen Generator oder eine Sequenz und gibt den neuen Wert zurück.Wenn Schritt gleich 0 ist, lässt die Funktion den Wert des Generators unverändert und gibt seinen aktuellen Wert zurück.

  • Ab Firebird 2.0 wird die SQL-kompatible Syntax NEXT VALUE FOR bevorzugt, außer wenn eine andere Erhöhung als 1 benötigt wird.

Warning

Wenn der Wert des Schrittparameters kleiner als Null ist, wird der Wert des Generators verringert.Achtung! Bei solchen Manipulationen in der Datenbank sollten Sie äußerst vorsichtig sein, da sie die Datenintegrität beeinträchtigen könnten.

Note

In Dialekt 1 ist der Ergebnistyp INTEGER, in Dialekt 2 und 3 ist er BIGINT.

GEN_ID-Beispiel

new.rec_id = gen_id(gen_recnum, 1);

Bedingte Funktionen

COALESCE()

Verfügbar in

DSQL, PSQL

Ergebnistyp

Abhängig von der Eingabe

Syntax
COALESCE (<exp1>, <exp2> [, <expN> ... ])
Table 1. COALESCE-Funktionsparameter
Parameter Beschreibung

exp1, exp2 …​ expN

Eine Liste von Ausdrücken aller kompatiblen Typen

Die Funktion COALESCE nimmt zwei oder mehr Argumente und gibt den Wert des ersten Nicht-NULL-Arguments zurück.Wenn alle Argumente NULL ergeben, ist das Ergebnis NULL.

COALESCE-Beispiele

Dieses Beispiel wählt den Nickname aus der Persons-Tabelle.Wenn es NULL ist, geht es weiter zu FirstName.Ist auch dieser NULL, wird “'Mr./Mrs.'” verwendet.Schließlich fügt es den Familiennamen hinzu.Insgesamt wird versucht, aus den verfügbaren Daten einen möglichst informellen vollständigen Namen zusammenzustellen.Beachten Sie, dass dieses Schema nur funktioniert, wenn fehlende Spitznamen und Vornamen wirklich NULL sind: Wenn einer von ihnen stattdessen ein leerer String ist, wird COALESCE diesen glücklich an den Aufrufer zurückgeben.

select
  coalesce (Nickname, FirstName, 'Mr./Mrs.') || ' ' || LastName
    as FullName
from Persons

DECODE()

Verfügbar in

DSQL, PSQL

Ergebnistyp

Abhängig von der Eingabe

Syntax
DECODE(<testexpr>,
  <expr1>, <result1>
  [<expr2>, <result2> …]
  [, <defaultresult>])

Das äquivalente CASE-Konstrukt:

CASE <testexpr>
  WHEN <expr1> THEN <result1>
  [WHEN <expr2> THEN <result2> …]
  [ELSE <defaultresult>]
END
Table 1. DECODE-Funktionsparameter
Parameter Beschreibung

testexpr

Ein Ausdruck eines beliebigen kompatiblen Typs, der mit den Ausdrücken expr1, expr2 …​ exprN . verglichen wird

expr1, expr2, …​ exprN

Ausdrücke beliebiger kompatibler Typen, mit denen der Ausdruck testexpr verglichen wird

result1, result2, …​ resultN

Rückgabewerte jeglichen Typs

defaultresult

Der Ausdruck, der zurückgegeben werden soll, wenn keine der Bedingungen erfüllt ist

DECODE ist eine Abkürzung für das sogenannte “Einfaches CASE”-Konstrukt, in dem ein gegebener Ausdruck mit einer Anzahl von andere Ausdrücke, bis eine Übereinstimmung gefunden wird.Das Ergebnis wird durch den Wert bestimmt, der nach dem übereinstimmenden Ausdruck aufgeführt ist.Wenn keine Übereinstimmung gefunden wird, wird das Standardergebnis zurückgegeben, falls vorhanden.Andernfalls wird NULL zurückgegeben.

Caution

Der Abgleich erfolgt mit dem Operator ‘=’. Wenn also testexpr NULL ist, wird es mit keinem der exprs übereinstimmen, nicht einmal mit denen, die NULL sind.

DECODE-Beispiele

select name,
  age,
  decode(upper(sex),
         'M', 'Male',
         'F', 'Female',
         'Unknown'),
  religion
from people
Siehe auch

CASE, Einfaches CASE

IIF()

Verfügbar in

DSQL, PSQL

Ergebnistyp

Abhängig von der Eingabe

Syntax
IIF (<condition>, ResultT, ResultF)
Table 1. IIF-Funktionsparameter
Parameter Beschreibung

condition

Ein wahrer|falscher Ausdruck

resultT

Der zurückgegebene Wert, wenn die Bedingung wahr ist

resultF

Der zurückgegebene Wert, wenn die Bedingung falsch ist

IIF benötigt drei Argumente.Wenn das erste Argument true ergibt, wird das zweite Argument zurückgegeben;andernfalls wird die dritte zurückgegeben.

IIF könnte in C-ähnlichen Sprachen mit dem ternären Operator “?:” verglichen werden.

Note

IIF(<Cond>, Result1, Result2) ist eine Abkürzung für “CASE WHEN <Cond> THEN Result1 ELSE Result2 END”.

IIF-Beispiele

select iif( sex = 'M', 'Sir', 'Madam' ) from Customers

MAXVALUE()

Verfügbar in

DSQL, PSQL

Ergebnistyp

Variiert je nach Eingabe — das Ergebnis hat denselben Datentyp wie der erste Ausdruck in der Liste (expr1).

Syntax
MAXVALUE (<expr1> [, ... , <exprN> ])
Table 1. MAXVALUE-Funktionsparameter
Parameter Beschreibung

expr1 …​ exprN

Liste der Ausdrücke kompatibler Typen

Gibt den Höchstwert aus einer Liste von numerischen, Zeichenfolgen- oder Datums-/Uhrzeitausdrücken zurück.Diese Funktion unterstützt vollständig Text-BLOBs jeder Länge und jedes beliebigen Zeichensatzes.

Wenn ein oder mehrere Ausdrücke in NULL aufgelöst werden, gibt MAXVALUE NULL zurück.Dieses Verhalten unterscheidet sich von der Aggregatfunktion MAX.

MAXVALUE-Beispiele

SELECT MAXVALUE(PRICE_1, PRICE_2) AS PRICE
  FROM PRICELIST

MINVALUE()

Verfügbar in

DSQL, PSQL

Ergebnistyp

Variiert je nach Eingabe — das Ergebnis hat denselben Datentyp wie der erste Ausdruck in der Liste (expr1).

Syntax
MINVALUE (<expr1> [, ... , <exprN> ])
Table 1. MINVALUE-Funktionsparameter
Parameter Beschreibung

expr1 …​ exprN

Liste der Ausdrücke kompatibler Typen

Gibt den Mindestwert aus einer Liste von numerischen, Zeichenfolgen- oder Datums-/Uhrzeitausdrücken zurück.Diese Funktion unterstützt vollständig Text-BLOBs jeder Länge und jedes beliebigen Zeichensatzes.

Wenn ein oder mehrere Ausdrücke in NULL aufgelöst werden, gibt MINVALUE NULL zurück.Dieses Verhalten unterscheidet sich von der Aggregatfunktion MIN.

MINVALUE-Beispiele

SELECT MINVALUE(PRICE_1, PRICE_2) AS PRICE
  FROM PRICELIST

NULLIF()

Verfügbar in

DSQL, PSQL

Ergebnistyp

Abhängig von der Eingabe

Syntax
NULLIF (<exp1>, <exp2>)
Table 1. NULLIF-Funktionsparameter
Parameter Beschreibung

exp1

Ein Ausdruck

exp2

Ein anderer Ausdruck eines Datentyps, der mit exp1 kompatibel ist

NULLIF gibt den Wert des ersten Arguments zurück, es sei denn, es ist gleich dem zweiten.In diesem Fall wird NULL zurückgegeben.

NULLIF-Beispiel

select avg( nullif(Weight, -1) ) from FatPeople

Dadurch wird das durchschnittliche Gewicht der in FatPeople aufgelisteten Personen zurückgegeben, mit Ausnahme derer mit einem Gewicht von -1, da "AVG" "NULL"-Daten überspringt.Vermutlich bedeutet -1 in dieser Tabelle “Gewicht unbekannt”.Ein einfaches AVG(Weight) würde die -1 Gewichte enthalten, wodurch das Ergebnis verzerrt wird.