FirebirdSQL logo

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.

docnext count = 33

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.