Strukturierte Datentypen

Die strukturierten Snowflake-Typen sind ARRAY, OBJECT, und MAP. Strukturierte Typen enthalten Elemente oder Schlüssel-Wert-Paare mit bestimmten Snowflake-Datentypen. Strukturierte Typen sind zum Beispiel:

  • Ein ARRAY-Typ mit INTEGER-Elementen

  • Ein OBJECT-Typ mit VARCHAR und NUMBER Schlüssel-Werte-Paaren

  • Ein MAP-Typ, der einen VARCHAR-Schlüssel mit einem DOUBLE-Wert verknüpft

Sie können strukturierte Typen auf folgende Weise verwenden:

  • Sie können eine Spalte für einen strukturierten Typ in einer Apache Iceberg™-Tabelle definieren.

    Die Apache Iceberg™-Datentypen list, struct und map entsprechen dem strukturierten ARRAY-Typ, dem strukturierten OBJECT-Typ und dem MAP-Typ in Snowflake.

    Eine Spalte vom strukturierten Typ unterstützt maximal 1.000 Unterspalten.

  • Sie verwenden strukturierte Typen, wenn Sie in einer Iceberg-Tabelle auf Daten in einer Spalte mit strukturiertem Typ zugreifen.

  • Sie können einen semistrukturierten ARRAY-, OBJECT- oder VARIANT-Wert in einen entsprechenden strukturierten Typ umwandeln (zum Beispiel einen ARRAY-Wert in einen ARRAY- Wert von INTEGER-Elementen). Sie können auch einen strukturierten Typ in einen semistrukturierten Typ umwandeln.

Bemerkung

Derzeit werden strukturierte Datentypen nur von Iceberg-Tabellen unterstützt. Sie können einer regulären Tabelle keine Spalten eines strukturierten Typs hinzufügen.

Unter diesem Thema wird erklärt, wie strukturierte Typen in Snowflake verwendet werden.

Festlegen eines strukturierten Typs

Um eine Spalte eines strukturierten Typs zu definieren oder einen Wert in einen strukturierten Typ umzuwandeln, verwenden Sie die in den folgenden Abschnitten beschriebene Syntax:

Festlegen eines strukturierten ARRAY-Typs

Um einen strukturierten ARRAY-Typ anzugeben, verwenden Sie die folgende Syntax:

ARRAY( <element_type> [ NOT NULL ] )
Copy

Wobei:

  • element_type ist der Snowflake-Datentyp der Elemente in diesem ARRAY.

    Sie können auch einen strukturierten ARRAY-Typ, einen strukturierten OBJECT-Typ oder einen strukturierten MAP-Typ angeben.

    Bemerkung

    Bei der Definition einer Iceberg-Tabellenspalte können Sie keinen VARIANT-Typ, keinen semistrukturierten ARRAYTyp oder semistrukturierten OBJECT-Typ als Typ des ARRAY-Elements angeben.

  • NOT NULL legt fest, dass der ARRAY-Typ keine Elemente enthalten darf, die NULL sind.

Vergleichen Sie zum Beispiel die von der Funktion SYSTEM$TYPEOF in der folgenden Anweisung zurückgegebenen Typen:

  • Der erste Spaltenausdruck wandelt einen semistrukturierten ARRAY-Wert in einen strukturierten ARRAY-Wert um (ein ARRAY von NUMBER-Elementen).

  • Der zweite Spaltenausdruck gibt einen semistrukturierten ARRAY-Wert an.

SELECT
  SYSTEM$TYPEOF(
    [1, 2, 3]::ARRAY(NUMBER)
  ) AS structured_array,
  SYSTEM$TYPEOF(
    [1, 2, 3]
  ) AS semi_structured_array;
Copy
+-------------------------------+-----------------------+
| STRUCTURED_ARRAY              | SEMI_STRUCTURED_ARRAY |
|-------------------------------+-----------------------|
| ARRAY(NUMBER(38,0))[LOB]      | ARRAY[LOB]            |
+-------------------------------+-----------------------+

Festlegen eines strukturierten OBJECT-Typs

Um einen strukturierten OBJECT-Typ anzugeben, verwenden Sie die folgende Syntax:

OBJECT(
  [
    <key> <value_type> [ NOT NULL ]
    [ , <key> <value_type> [ NOT NULL ] ]
    [ , ... ]
  ]
)
Copy

Wobei:

  • key gibt einen Schlüssel für den OBJECT-Typ an.

    • Jede key in einer OBJECT-Definition muss eindeutig sein.

    • Die Reihenfolge der Schlüssel ist Teil der OBJECT-Definition. Der Vergleich von zwei OBJECT-Werten, die dieselben Schlüssel in unterschiedlicher Reihenfolge haben, ist nicht erlaubt. (Ein Kompilierzeitfehler tritt auf.)

    • Wenn Sie keinen Schlüssel, aber die Klammern angeben (d. h. wenn Sie OBJECT() verwenden), ist der resultierende Typ ein strukturierter OBJECT-Typ, der keine Schlüssel enthält. Ein strukturierter OBJECT-Typ ohne Schlüssel unterscheidet sich von einem semistrukturierten OBJECT-Typ.

  • value_type ist der Snowflake-Datentyp des Wertes zum zugehörigen Schlüssel.

    Sie können auch einen strukturierten ARRAY-Typ, einen strukturierten OBJECT-Typ oder einen strukturierten MAP-Typ als Typ des Wertes angeben.

    Bemerkung

    In der Definition einer Iceberg-Tabellenspalte können Sie keinen VARIANT-Typ, keinen semistrukturierten ARRAY-Typ und keinen semistrukturierten OBJECT-Typ als Typ des Wertes angeben, der dem OBJECT-Schlüssel entspricht.

  • NOT NULL gibt an, dass der dem Schlüssel entsprechende Wert nicht NULL sein darf.

Vergleichen Sie zum Beispiel die von der Funktion SYSTEM$TYPEOF in der folgenden Anweisung zurückgegebenen Typen:

  • Der erste Spaltenausdruck wandelt einen semistrukturierten OBJECT-Wert in einen strukturierten OBJECT-Wert um, der die folgenden Schlüssel und Werte enthält:

    • Ein Schlüssel namens str mit einem VARCHAR-Wert, der nicht NULL ist.

    • Ein Schlüssel namens num mit einem NUMBER-Wert.

  • Der zweite Spaltenausdruck gibt einen semistrukturierten OBJECT-Wert an.

SELECT
  SYSTEM$TYPEOF(
    {
      'str': 'test',
      'num': 1
    }::OBJECT(
      str VARCHAR NOT NULL,
      num NUMBER
    )
  ) AS structured_object,
  SYSTEM$TYPEOF(
    {
      'str': 'test',
      'num': 1
    }
  ) AS semi_structured_object;
Copy
+---------------------------------------------------------------+------------------------+
| STRUCTURED_OBJECT                                             | SEMI_STRUCTURED_OBJECT |
|---------------------------------------------------------------+------------------------|
| OBJECT(str VARCHAR(16777216) NOT NULL, num NUMBER(38,0))[LOB] | OBJECT[LOB]            |
+---------------------------------------------------------------+------------------------+

Festlegen eines MAP-Typs

Um einen MAP-Typ anzugeben, verwenden Sie die folgende Syntax:

MAP( <key_type> , <value_type> [ NOT NULL ] )
Copy

Wobei:

  • key_type ist der Snowflake-Datentyp des Schlüssels für die Zuordnungsstruktur. Verwenden Sie für die Schlüssel einen der folgenden Typen:

    • VARCHAR

    • NUMBER mit der Dezimalstellenzahl 0

    Sie können keinen Gleitkomma-Datentyp als Typ für den Schlüssel verwenden.

    Zuordnungsschlüssel dürfen nicht NULL sein.

  • value_type ist der Snowflake-Datentyp der Werte in der Zuordnung.

    Sie können auch einen strukturierten ARRAY-Typ, einen strukturierten OBJECT-Typ oder einen strukturierten MAP-Typ als Typ der Werte angeben.

    Bemerkung

    In der Definition einer Iceberg-Tabellenspalte können Sie keinen VARIANT-Typ, keinen semistrukturierten ARRAY-Typ und keinen semistrukturierten OBJECT-Typ als Typ des Wertes im MAP-Typ angeben.

  • NOT NULL gibt an, dass der dem Schlüssel entsprechende Wert nicht NULL sein darf.

Das folgende Beispiel wandelt einen semistrukturierten OBJECT-Wert in einen MAP-Wert um und verwendet die Funktion SYSTEM$TYPEOF, um den resultierenden Typ des Wertes zu drucken. Der MAP-Typ verknüpft VARCHAR-Schlüssel mit VARCHAR-Werten.

SELECT
  SYSTEM$TYPEOF(
    {
      'a_key': 'a_val',
      'b_key': 'b_val'
    }::MAP(VARCHAR, VARCHAR)
  ) AS map_example;
Copy
+------------------------------------------------+
| MAP_EXAMPLE                                    |
|------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+

Verwenden von strukturierten Typen in semistrukturierten Typen

Sie können einen MAP-, einen strukturierten OBJECT- oder einen strukturierten ARRAY-Wert nicht in einem VARIANT-, semistrukturierten OBJECT- oder semistrukturierten ARRAY-Wert verwenden. In den folgenden Fällen tritt ein Fehler auf:

  • Sie verwenden einen MAP-Wert, einen strukturierten OBJECT-Wert oder einen strukturierten ARRAY-Wert in einer OBJECT-Konstante oder ARRAY-Konstante.

  • Sie übergeben einen MAP-Wert, einen strukturierten OBJECT-Wert oder einen strukturierten ARRAY-Wert an eine OBJECT- oder ARRAY-Konstruktorfunktion.

Konvertieren strukturierter und semistrukturierter Typen

Die folgende Tabelle fasst die Regeln für das Konvertieren strukturierter OBJECT-, strukturierter ARRAY- und MAP-Werte in halbstrukturierte OBJECT-, ARRAY- und VARIANT-Werte (und umgekehrt) zusammen.

Quelldatentyp

Zieldatentyp

Umwandlung

Koersion

Semistrukturierter ARRAY-Typ

Strukturierter ARRAY-Typ

Semistrukturierter OBJECT-Typ

  • Strukturierter OBJECT-Typ

  • MAP

Semistrukturierter VARIANT-Typ

  • Strukturierter ARRAY-Typ

  • Strukturierter OBJECT-Typ

  • MAP

Strukturierter ARRAY-Typ

Semistrukturierter ARRAY-Typ

  • Strukturierter OBJECT-Typ

  • MAP

Semistrukturierter OBJECT-Typ

  • Strukturierter ARRAY-Typ

  • Strukturierter OBJECT-Typ

  • MAP

Semistrukturierter VARIANT-Typ

In den folgenden Abschnitten werden diese Einschränkungen ausführlicher erläutert:

Explizites Umwandeln eines semistrukturierten Typs in einen strukturierten Typ

Um einen Wert eines semistrukturierten Typs explizit in einen Wert eines strukturierten Typs umzuwandeln, können Sie die Funktion CAST aufrufen oder den :: Operator verwenden.

Bemerkung

TRY_CAST wird für strukturierte Typen nicht unterstützt.

Sie können nur Werte der folgenden semistrukturierten Typen in Werte des entsprechenden strukturierten Typs umwandeln; in allen anderen Fällen kommt es zu einem Laufzeitfehler.

Semistrukturierte Typen

Strukturierter Typ, der umgewandelt werden kann in

ARRAY

Strukturierter ARRAY-Typ

OBJECT

MAP-Typ oder strukturierter OBJECT-Typ

VARIANT

MAP-Typ oder strukturierter ARRAY- oder OBJECT-Typ

In den nächsten Abschnitten erfahren Sie mehr darüber, wie die Typen umgewandelt werden:

Umwandeln von semistrukturierten ARRAY- und VARIANT-Werten in strukturierte ARRAY-Werte

Die folgenden Schritte zeigen, wie ein semistrukturierten ARRAY- oder VARIANT-Wert in einen ARRAY-Wert von NUMBER-Elementen umgewandelt wird:

SELECT
  SYSTEM$TYPEOF(
    CAST ([1,2,3] AS ARRAY(NUMBER))
  ) AS array_cast_type,
  SYSTEM$TYPEOF(
    CAST ([1,2,3]::VARIANT AS ARRAY(NUMBER))
  ) AS variant_cast_type;
Copy

Oder:

SELECT
  SYSTEM$TYPEOF(
    [1,2,3]::ARRAY(NUMBER)
  ) AS array_cast_type,
  SYSTEM$TYPEOF(
    [1,2,3]::VARIANT::ARRAY(NUMBER)
  ) AS variant_cast_type;
Copy
+--------------------------+--------------------------+
| ARRAY_CAST_TYPE          | VARIANT_CAST_TYPE        |
|--------------------------+--------------------------|
| ARRAY(NUMBER(38,0))[LOB] | ARRAY(NUMBER(38,0))[LOB] |
+--------------------------+--------------------------+

Wenn Sie einen semistrukturierten ARRAY- oder VARIANT-Wert in einen strukturierten ARRAY-Wert umwandeln, beachten Sie Folgendes:

  • Jedes Element des ARRAY-Werts wird in den angegebenen Typ des ARRAY-Werts umgewandelt.

    Das Umwandeln der ARRAY-Spalte in ARRAY (VARCHAR) führt zur Konvertierung jedes Werts in einen VARCHAR-Wert:

    SELECT
      CAST ([1,2,3] AS ARRAY(VARCHAR)) AS varchar_array,
      SYSTEM$TYPEOF(varchar_array) AS array_cast_type;
    
    Copy
    +---------------+-------------------------------+
    | VARCHAR_ARRAY | ARRAY_CAST_TYPE               |
    |---------------+-------------------------------|
    | [             | ARRAY(VARCHAR(16777216))[LOB] |
    |   "1",        |                               |
    |   "2",        |                               |
    |   "3"         |                               |
    | ]             |                               |
    +---------------+-------------------------------+
    
  • Wenn das Element nicht in den angegebenen Typ umgewandelt werden kann (zum Beispiel ['a', 'b', 'c'] in ARRAY (NUMBER)), schlägt die Umwandlung fehl.

  • Wenn der ARRAY-Wert NULL-Elemente enthält und der Typ ARRAY NOT NULL angibt (z. B. [1, NULL, 3] in ARRAY (NUMBER NOT NULL), schlägt die Umwandlung fehl.

  • Elemente, die JSON-Nullwerte sind, werden in NULL konvertiert, wenn der Zielelementtyp keine JSON-Nullen unterstützt (d. h. der Zieltyp ist kein halbstrukturierter ARRAY-, OBJECT- oder VARIANT-Typ).

    Wenn Sie beispielsweise eine Umwandlung in ARRAY (NUMBER) vornehmen, werden JSON-Nullwerte in NULL umgewandelt, da NUMBER keine JSON-Nullwerte unterstützt.

    Wenn Sie hingegen eine Umwandlung in ARRAY (VARIANT) vornehmen, werden JSON-Nullwerte nicht in NULL umgewandelt, da VARIANT JSON-Nullwerte unterstützt.

Umwandeln von semistrukturierten OBJECT- und VARIANT-Werten in strukturierte OBJECT-Werte

Die folgenden Schritte zeigen, wie ein semistrukturierter OBJECT- oder VARIANT-Wert in einen strukturierten OBJECT-Wert umgewandelt wird, der die Schlüssel-Wert-Paare city und state enthält (bei denen es sich um VARCHAR-Werte handelt):

SELECT
  SYSTEM$TYPEOF(
    CAST ({'city':'San Mateo','state':'CA'} AS OBJECT(city VARCHAR, state VARCHAR))
  ) AS object_cast_type,
  SYSTEM$TYPEOF(
    CAST ({'city':'San Mateo','state':'CA'}::VARIANT AS OBJECT(city VARCHAR, state VARCHAR))
  ) AS variant_cast_type;
Copy

Oder:

SELECT
  SYSTEM$TYPEOF(
     {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  ) AS object_cast_type,
  SYSTEM$TYPEOF(
     {'city':'San Mateo','state':'CA'}::VARIANT::OBJECT(city VARCHAR, state VARCHAR)
  ) AS variant_cast_type;
Copy
+--------------------------------------------------------------+--------------------------------------------------------------+
| OBJECT_CAST_TYPE                                             | VARIANT_CAST_TYPE                                            |
|--------------------------------------------------------------+--------------------------------------------------------------|
| OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] |
+--------------------------------------------------------------+--------------------------------------------------------------+

Wenn Sie einen semistrukturierten OBJECT- oder VARIANT-Wert in einen strukturierten OBJECT-Wert umwandeln, beachten Sie Folgendes:

  • Der OBJECT-Wert darf keine zusätzlichen Schlüssel enthalten, die nicht im OBJECT-Typ angegeben sind.

    Wenn es zusätzliche Schlüssel gibt, schlägt die Umwandlung fehl.

  • Fehlt im OBJECT-Wert ein Schlüssel, der im OBJECT-Typ angegeben ist, schlägt die Umwandlung fehl.

  • Der Wert jedes Schlüssels im OBJECT-Wert wird in den für diesen Schlüssel angegebenen Typ umgewandelt.

    Wenn ein Wert nicht in den angegebenen Typ umgewandelt werden kann, schlägt die Umwandlung fehl.

  • Wenn der Wert eines Schlüssels ein JSON-Nullwert ist und der Zielwerttyp keine JSON-Nullen unterstützt (d. h. der Zieltyp ist kein semistrukturierter ARRAY-, OBJECT- oder VARIANT-Typ), wird der Wert in einen NULL-Wert konvertiert.

    Wenn Sie beispielsweise eine Umwandlung in OBJECT(city VARCHAR) vornehmen, werden JSON-Nullwerte in NULL-Werte umgewandelt, da VARCHAR keine JSON-Nullwerte unterstützt.

    Wenn Sie hingegen eine Umwandlung in OBJECT(city VARIANT) vornehmen, werden JSON-Nullwerte nicht in NULL umgewandelt, da der VARIANT-Typ JSON-Nullwerte unterstützt.

Umwandeln von semistrukturierten OBJECT- und VARIANT-Werten in MAP-Werte

Die folgenden Anweisungen zeigen, wie Sie einen semstrukturierten OBJECT- oder VARIANT-Wert in einen MAP-Wert umwandeln, der einen VARCHAR-Schlüssel mit einem VARCHAR-Wert verknüpft:

SELECT
  SYSTEM$TYPEOF(
    CAST ({'my_key':'my_value'} AS MAP(VARCHAR, VARCHAR))
  ) AS map_cast_type,
  SYSTEM$TYPEOF(
    CAST ({'my_key':'my_value'} AS MAP(VARCHAR, VARCHAR))
  ) AS variant_cast_type;
Copy

Oder:

SELECT
  SYSTEM$TYPEOF(
    {'my_key':'my_value'}::MAP(VARCHAR, VARCHAR)
  ) AS map_cast_type,
  SYSTEM$TYPEOF(
    {'my_key':'my_value'}::VARIANT::MAP(VARCHAR, VARCHAR)
  ) AS variant_cast_type;
Copy
+------------------------------------------------+------------------------------------------------+
| MAP_CAST_TYPE                                  | VARIANT_CAST_TYPE                              |
|------------------------------------------------+------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] | MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+------------------------------------------------+

Wenn Sie einen semistrukturierten OBJECT- oder VARIANT- Wert in einen MAP-Wert umwandeln, beachten Sie Folgendes:

  • Wenn die Schlüssel und Werte nicht mit den angegebenen Typen übereinstimmen, werden die Schlüssel und Werte in die angegebenen Typen konvertiert.

  • Wenn die Schlüssel und Werte nicht in die angegebenen Typen umgewandelt werden können, schlägt die Umwandlung fehl.

  • Wenn der Wert eines Schlüssels ein JSON-Nullwert ist und der Zielwerttyp keine JSON-Nullen unterstützt (d. h. der Zieltyp ist kein semistrukturierter ARRAY-, OBJECT- oder VARIANT-Typ), wird der Wert in einen NULL-Wert konvertiert.

    Wenn Sie beispielsweise eine Umwandlung in MAP (VARCHAR, VARCHAR) vornehmen, werden JSON-Nullwerte in NULL umgewandelt, da VARCHAR keine JSON-Nullwerte unterstützt.

    Wenn Sie hingegen eine Umwandlung in MAP(VARCHAR, VARIANT) vornehmen, werden JSON-Nullwerte nicht in NULL umgewandelt, da VARIANT JSON-Nullwerte unterstützt.

Explizites Umwandeln eines strukturierten Typs in einen semistrukturierten Typ

Um einen Wert eines strukturierten Typs explizit in einen Wert eines semistrukturierten Typs umzuwandeln, können Sie die Funktion CAST aufrufen, den :: Operator verwenden oder eine der Konvertierungsfunktionen aufrufen (zum Beispiel TO_ARRAY, TO_OBJECT oder TO_VARIANT).

Bemerkung

TRY_CAST wird bei strukturierten Typen nicht unterstützt.

Strukturierter Typ

Semistrukturierter Typ, der umgewandelt werden kann in

Strukturierter ARRAY-Typ

ARRAY

MAP-Typ oder strukturierter OBJECT-Typ

OBJECT

MAP-, strukturierter ARRAY- oder strukturierter OBJECT-Typ

VARIANT

Beispiel:

  • Wenn col_structured_array vom Typ ARRAY (VARCHAR) ist:

    • CAST(col_structured_array AS ARRAY) gibt einen semistrukturierten ARRAY-Wert zurück.

    • CAST(col_structured_array AS VARIANT) gibt einen VARIANT-Wert zurück, der einen semistrukturierten ARRAY-Wert enthält.

  • Wenn col_structured_object vom Typ OBJECT (name VARCHAR, state VARCHAR) ist:

    • CAST(col_structured_object AS OBJECT) gibt einen semistrukturierten OBJECT-Wert zurück.

    • CAST(col_structured_object AS VARIANT) gibt einen VARIANT-Wert zurück, der einen semistrukturierten OBJECT-Wert enthält.

  • Wenn col_map vom Typ MAP(VARCHAR, VARCHAR) ist:

    • CAST(col_map AS OBJECT) gibt einen semistrukturierten OBJECT-Wert zurück.

    • CAST(col_map AS VARIANT) gibt einen VARIANT-Wert zurück, der einen semistrukturierten OBJECT-Wert enthält.

Beachten Sie Folgendes:

  • Wenn Sie in einen semistrukturierten OBJECT-Wert umwandeln, wird die Reihenfolge der Schlüssel im strukturierten OBJECT-Wert nicht beibehalten.

  • Wenn Sie einen strukturierten OBJECT- oder MAP-Wert in einen semistrukturierten OBJECT- oder VARIANT-Wert umwandeln, werden alle NULL-Werte in JSON-Nullwerte umgewandelt.

    Wenn Sie einen strukturierten ARRAY-Wert in einen VARIANT-Wert umwandeln, bleiben die NULL-Werte unverändert erhalten.

    SELECT [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT;
    
    Copy
    +---------------------------------------+
    | [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT |
    |---------------------------------------|
    | [                                     |
    |   1,                                  |
    |   2,                                  |
    |   undefined,                          |
    |   3                                   |
    | ]                                     |
    +---------------------------------------+
    
  • Wenn Sie einen MAP-Wert umwandeln, der einen NUMBER-Typ für Schlüssel verwendet, werden die MAP-Schlüssel im zurückgegebenen OBJECT-Wert in Zeichenfolgen konvertiert.

Implizites Umwandeln eines Wertes (Koersion)

Die folgenden Regeln gelten für implizites Umwandeln (Koersion) von einem Wert eines strukturierten Typs in einem Wert eines anderen strukturierten Typs:

  • Ein Wert eines strukturierten Typs kann in einen Wert eines anderen strukturierten Typs umgewandelt werden, wenn die beiden Basistypen identisch sind:

    • Ein ARRAY-Wert kann in einen anderen ARRAY-Wert implizit umgewandelt werden (Koersion), sofern Koersion vom ersten Elementtyp in den zweiten Elementtyp möglich ist.

      Ein Elementtyp kann in einem der folgenden Fälle implizit in einen anderen Elementtyp umgewandelt werden (Koersion):

      • Beide Typen sind numerisch. Die folgenden Fälle werden unterstützt:

        • Beide verwenden denselben numerischen Typ, unterscheiden sich aber möglicherweise in der Genauigkeit und/oder der Dezimalstellenzahl.

        • Koersion von NUMBER in FLOAT (und umgekehrt).

      • Beide Typen sind Zeitstempel. Die folgenden Fälle werden unterstützt:

        • Beide verwenden denselben Typ, unterscheiden sich aber möglicherweise in der Genauigkeit.

        • Koersion von TIMESTAMP_LTZ in TIMESTAMP_TZ (und umgekehrt).

      Beispiel:

      • Ein ARRAY (NUMBER)-Wert kann in einen ARRAY (DOUBLE)-Wert umgewandelt werden.

      • Ein ARRAY (DATE)-Wert kann nicht in einen ARRAY (NUMBER)-Wert umgewandelt werden.

    • Ein OBJECT-Wert mit einer Typdefinition kann nur dann in einen OBJECT-Wert mit einer anderen Typdefinition implizit umgewandelt werden, wenn alle der folgenden Punkte zutreffen:

      • Beide OBJECT-Typen haben die gleiche Anzahl von Schlüsseln.

      • Beide OBJECT-Typen verwenden die gleichen Namen für die Schlüssel.

      • Die Schlüssel in beiden OBJECT-Typen sind in der gleichen Reihenfolge.

      • Der Typ jedes Wertes in einem OBJECT-Typ kann in den Typ des entsprechenden Wertes in dem anderen OBJECT-Typ implizit umgewandelt werden.

        Wie bei den Elementtypen in strukturierten ARRAY-Werten kann der Typ eines Werts nur unter folgenden Voraussetzungen in einen anderen Typ implizit umgewandelt werden:

        • Beide Typen sind numerisch. Die folgenden Fälle werden unterstützt:

          • Beide verwenden denselben numerischen Typ, unterscheiden sich aber möglicherweise in der Genauigkeit und/oder der Dezimalstellenzahl.

          • Koersion von NUMBER in FLOAT (und umgekehrt).

        • Beide Typen sind Zeitstempel. Die folgenden Fälle werden unterstützt:

          • Beide verwenden denselben Typ, unterscheiden sich aber möglicherweise in der Genauigkeit.

          • Koersion von TIMESTAMP_LTZ in TIMESTAMP_TZ (und umgekehrt).

      Beispiel:

      • Ein OBJECT (city VARCHAR, zipcode NUMBER)-Wert kann in einen Wert OBJECT(city VARCHAR, zipcode DOUBLE) umgewandelt werden.

      • Ein OBJECT (city VARCHAR, zipcode NUMBER)-Wert kann in einen Wert OBJECT (city VARCHAR, zipcode DATE) umgewandelt werden.

    • Ein MAP-Wert mit einem Werttyp kann in einen MAP-Wert mit einem anderen Werttyp umgewandelt werden, wenn:

      • Beide Wertetypen sind numerisch. Die folgenden Fälle werden unterstützt:

        • Beide verwenden denselben numerischen Typ, unterscheiden sich aber möglicherweise in der Genauigkeit und/oder der Dezimalstellenzahl.

        • Koersion von NUMBER in FLOAT (und umgekehrt).

      • Beide Werttypen sind Zeitstempel. Die folgenden Fälle werden unterstützt:

        • Beide verwenden denselben Typ, unterscheiden sich aber möglicherweise in der Genauigkeit.

        • Koersion von TIMESTAMP_LTZ in TIMESTAMP_TZ (und umgekehrt).

      Beispielsweise kann ein MAP (VARCHAR, NUMBER)-Wert in einen MAP(VARCHAR, DOUBLE)-Wert implizit umgewandelt werden.

    • Ein MAP-Wert mit einem Schlüsseltyp kann in einen MAP-Wert mit einem anderen Schlüsseltyp umgewandelt werden, wenn beide Schlüsseltypen denselben ganzzahligen NUMERIC-Typ verwenden, der sich nur in der Genauigkeit unterscheidet.

      Beispielsweise kann ein MAP (VARCHAR, NUMBER)-Wert nicht in einen MAP (NUMBER, NUMBER)-Wert implizit umgewandelt werden.

  • Ein Wert eines strukturierten Typs kann nicht in einen Wert eines semstrukturierten Typs implizit umgewandelt werden (und umgekehrt).

  • Ein VARCHAR-Wert kann nicht in einen Wert eines strukturierten Typs implizit umgewandelt werden.

Umwandeln von einem strukturierten Typ in einen anderen

Sie können die Funktion CAST aufrufen oder den :: Operator verwenden, um von einem Wert eines strukturierten Typs in einen Wert eines anderen strukturierten Typs umzuwandeln. Sie können Werte von und in die folgenden strukturierten Typen umwandeln:

Bemerkung

TRY_CAST wird bei strukturierten Typen nicht unterstützt.

Wenn es nicht möglich ist, die Werte von einem Typ in den anderen umzuwandeln, schlägt die Umwandlung fehl. Beispielsweise schlägt der Versuch fehl, einen ARRAY (BOOLEAN)-Wert in einen ARRAY (DATE)-Wert umzuwandeln.

Beispiel: Umwandeln eines ARRAY-Werts in einen anderen

Im folgenden Beispiel wird ein ARRAY (NUMBER)-Wert in einen ARRAY (VARCHAR)-Wert umgewandelt:

SELECT CAST(
  CAST([1,2,3] AS ARRAY(NUMBER))
  AS ARRAY(VARCHAR)) AS cast_array;
Copy
+------------+
| CAST_ARRAY |
|------------|
| [          |
|   "1",     |
|   "2",     |
|   "3"      |
| ]          |
+------------+

Beispiel: Ändern der Reihenfolge von Schlüssel-Wert-Paaren in einem OBJECT-Wert

Im folgenden Beispiel wird die Reihenfolge der Schlüssel-Wert-Paare in einem strukturierten OBJECT-Wert geändert:

SELECT CAST(
  {'city': 'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(state VARCHAR, city VARCHAR)) AS object_value_order;
Copy
+-----------------------+
| OBJECT_VALUE_ORDER    |
|-----------------------|
| {                     |
|   "state": "CA",      |
|   "city": "San Mateo" |
| }                     |
+-----------------------+

Beispiel: Ändern der Schlüsselnamen in einem OBJECT-Wert

Um die Schlüsselnamen in einem strukturierten OBJECT-Wert zu ändern, geben Sie die Schlüsselwörter RENAME FIELDS am Ende von CAST an. Beispiel:

SELECT CAST({'city':'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(city_name VARCHAR, state_name VARCHAR) RENAME FIELDS) AS object_value_key_names;
Copy
+-----------------------------+
| OBJECT_VALUE_KEY_NAMES      |
|-----------------------------|
| {                           |
|   "city_name": "San Mateo", |
|   "state_name": "CA"        |
| }                           |
+-----------------------------+

Beispiel: Hinzufügen von Schlüsseln zu einem OBJECT-Wert

Wenn der Typ, in den umgewandelt wird, zusätzliche Schlüssel-Wert-Paare hat, die im ursprünglichen strukturierten OBJECT-Wert nicht vorhanden sind, geben Sie die Schlüsselwörter ADD FIELDS am Ende von CAST an. Beispiel:

SELECT CAST({'city':'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
  AS OBJECT(city VARCHAR, state VARCHAR, zipcode NUMBER) ADD FIELDS) AS add_fields;
Copy
+------------------------+
| ADD_FIELDS             |
|------------------------|
| {                      |
|   "city": "San Mateo", |
|   "state": "CA",       |
|   "zipcode": null      |
| }                      |
+------------------------+

Die Werte für die neu hinzugefügten Schlüssel werden auf NULL gesetzt. Wenn Sie diesen Schlüsseln einen Wert zuweisen möchten, rufen Sie stattdessen die Funktion OBJECT_INSERT auf.

Erstellen von strukturierten ARRAY-, strukturierten OBJECT- und MAP- Werten

In den folgenden Abschnitten wird erklärt, wie strukturierte ARRAY-, strukturierte OBJECT- und MAP-Werte erstellt werden.

Verwenden von SQL-Funktionen zum Erstellen von strukturierten ARRAY- und OBJECT-Werten

Mit den folgenden Funktionen werden semistrukturierte ARRAY-Werte erstellt:

Mit den folgenden Funktionen werden semistrukturierte OBJECT-Werte erstellt:

Um einen strukturierten ARRAY- oder OBJECT-Wert zu konstruieren, verwenden Sie diese Funktionen und wandelt den Rückgabewert der Funktion explizit um. Beispiel:

SELECT ARRAY_CONSTRUCT(10, 20, 30)::ARRAY(NUMBER);
Copy
SELECT OBJECT_CONSTRUCT(
  'oname', 'abc',
  'created_date', '2020-01-18'::DATE
)::OBJECT(
  oname VARCHAR,
  created_date DATE
);
Copy

Weitere Informationen dazu finden Sie unter Explizites Umwandeln eines semistrukturierten Typs in einen strukturierten Typ.

Bemerkung

Sie können diesen Funktionen keine strukturierten ARRAY-Werte, strukturierten OBJECT-Werte oder MAP-Werte übergeben. Dies würde dazu führen, dass ein strukturierter Typ implizit in einen semistrukturierten Typ umgewandelt wird, was nicht zulässig ist, wie unter Implizites Umwandeln eines Wertes (Koersion) erwähnt.

Verwenden von ARRAY- und OBJECT-Konstanten zum Erstellen von strukturierten ARRAY- und OBJECT-Werten

Wenn Sie eine ARRAY-Konstante oder eine OBJECT-Konstante angeben, geben Sie einen semistrukturierten ARRAY- oder OBJECT-Wert an.

Um einen strukturierten ARRAY- oder OBJECT-Wert zu konstruieren, müssen Sie den Ausdruck explizit umwandeln. Beispiel:

SELECT [10, 20, 30]::ARRAY(NUMBER);
Copy
SELECT {
  'oname': 'abc',
  'created_date': '2020-01-18'::DATE
}::OBJECT(
  oname VARCHAR,
  created_date DATE
);
Copy

Weitere Informationen dazu finden Sie unter Explizites Umwandeln eines semistrukturierten Typs in einen strukturierten Typ.

Erstellen eines MAP-Werts

Um einen MAP-Wert zu erstellen, erstellen Sie einen semistrukturierten OBJECT-Wert und wandeln den OBJECT-Wert in einen MAP-Wert um.

Die folgenden Anweisungen erstellen zum Beispiel beide den Wert MAP {'city'->'San Mateo','state'->'CA'}:

SELECT OBJECT_CONSTRUCT(
  'city', 'San Mateo',
  'state', 'CA'
)::MAP(
  VARCHAR,
  VARCHAR
);
Copy
SELECT {
  'city': 'San Mateo',
  'state': 'CA'
}::MAP(
  VARCHAR,
  VARCHAR
);
Copy

Die folgende Anweisung erstellt den Wert MAP {-10->'CA',-20->'OR'}:

SELECT {
  '-10': 'CA',
  '-20': 'OR'
}::MAP(
  NUMBER,
  VARCHAR
);
Copy

Weitere Informationen dazu finden Sie unter Umwandeln von semistrukturierten OBJECT- und VARIANT-Werten in MAP-Werte.

Verwenden von Schlüsseln, Werten und Elementen in Werten von strukturierten Typen

In den folgenden Abschnitten wird erklärt, wie Schlüssel, Werte und Elemente in Werten von strukturierten Typen verwenden.

Abrufen der Liste der Schlüssel aus einem strukturierten OBJECT-Wert

Um die Liste der Schlüssel in einem strukturierten OBJECT-Wert zu erhalten, rufen Sie die Funktion OBJECT_KEYS auf:

SELECT OBJECT_KEYS({'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR));
Copy

Wenn die Eingabe ein strukturierter OBJECT-Wert ist, gibt die Funktion einen ARRAY (VARCHAR)-Wert zurück, der die Schlüssel enthält. Wenn die Eingabe ein semistrukturierter OBJECT-Wert ist, gibt die Funktion einen ARRAY-Wert zurück.

Abrufen der Liste von Schlüsseln aus einem MAP-Wert

Um die Liste der Schlüssel in einem MAP-Wert zu erhalten, rufen Sie die Funktion MAP_KEYS auf:

SELECT MAP_KEYS({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Copy

Zugriff auf Werte und Elemente aus Werten von strukturierten Typen

Sie können die folgenden Methoden verwenden, um auf Werte und Elemente von strukturierten ARRAY-, strukturierten OBJECT- und MAP-Werten zuzugreifen:

Die zurückgegebenen Werte und Elemente haben den für den strukturierten Wert angegebenen Typ und nicht VARIANT.

Das folgende Beispiel übergibt das erste Element eines semistrukturierten ARRAY-Werts und einen ARRAY (VARCHAR)-Wert an die Funktion SYSTEM$TYPEOF, um den Datentyp dieses Elements zurückzugeben:

SELECT
  SYSTEM$TYPEOF(
    ARRAY_CONSTRUCT('San Mateo')[0]
  ) AS semi_structured_array_element,
  SYSTEM$TYPEOF(
    CAST(
      ARRAY_CONSTRUCT('San Mateo') AS ARRAY(VARCHAR)
    )[0]
  ) AS structured_array_element;
Copy
+-------------------------------+-----------------------------+
| SEMI_STRUCTURED_ARRAY_ELEMENT | STRUCTURED_ARRAY_ELEMENT    |
|-------------------------------+-----------------------------|
| VARIANT[LOB]                  | VARCHAR(16777216)[LOB]      |
+-------------------------------+-----------------------------+

Beachten Sie Folgendes:

  • Wenn Sie einen strukturierten OBJECT-Wert an die Funktion GET oder GET_IGNORE_CASE übergeben, müssen Sie eine Konstante für den Schlüssel angeben.

    Sie müssen keine Konstante angeben, wenn Sie einen MAP- oder strukturierten ARRAY-Wert an die Funktion GET übergeben.

    Sie müssen auch keine Konstante angeben, wenn Sie einen MAP-Wert an die Funktion GET_IGNORE_CASE übergeben.

  • Wenn Sie einen strukturierten OBJECT-, strukturierten ARRAY- oder MAP-Wert an die Funktion GET_PATH übergeben, müssen Sie eine Konstante für den Pfadnamen angeben.

  • Wenn Sie für einen strukturierten OBJECT-Wert einen OBJECT-Schlüssel oder einen Pfad verwenden, der nicht existiert, tritt ein Kompilierungsfehler auf.

    Wenn Sie dagegen einen Index, Schlüssel oder Pfad verwenden, der bei einem semistrukturierten OBJECT-Wert nicht vorhanden ist, gibt die Funktion NULL zurück.

Bestimmen der Größe eines strukturierten ARRAY-Werts

Um die Größe eines strukturierten ARRAY-Werts zu bestimmen, übergeben Sie den ARRAY-Wert an die Funktion ARRAY_SIZE:

SELECT ARRAY_SIZE([1,2,3]::ARRAY(NUMBER));
Copy

Bestimmen der Größe eines MAP-Werts

Um die Größe eines MAP-Werts zu bestimmen, übergeben Sie den MAP-Wert an die Funktion MAP_SIZE:

SELECT MAP_SIZE({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Copy

Suchen von Elementen in einem strukturierten ARRAY-Wert

Um festzustellen, ob ein Element in einem strukturierten ARRAY-Wert vorhanden ist, rufen Sie die Funktion ARRAY_CONTAINS auf. Beispiel:

SELECT ARRAY_CONTAINS(10, [1, 10, 100]::ARRAY(NUMBER));
Copy

Um die Position eines Elements in einem strukturierten ARRAY-Wert zu bestimmen, rufen Sie die Funktion ARRAY_POSITION auf. Beispiel:

SELECT ARRAY_POSITION(10, [1, 10, 100]::ARRAY(NUMBER));
Copy

Bemerkung

Verwenden Sie für beide Funktionen ein Element des Typs , der mit dem Typ des ARRAY-Werts vergleichbar ist.

Der Ausdruck für das Element darf nicht in einen VARIANT-Wert umgewandelt werden.

Feststellen, ob ein MAP-Wert einen Schlüssel enthält

Um festzustellen, ob ein MAP-Wert einen Schlüssel enthält, rufen Sie die Funktion MAP_CONTAINS_KEY auf:

Beispiel:

SELECT MAP_CONTAINS_KEY('key_to_find', my_map);
Copy
SELECT MAP_CONTAINS_KEY(10, my_map);
Copy

Werte vergleichen

In den folgenden Abschnitten wird erklärt, wie Sie Werte vergleichen können:

Vergleich von strukturierten Werten mit semistrukturierten Werten

Sie können einen strukturierten ARRAY-, strukturierten OBJECT- oder MAP-Wert nicht mit einem semistrukturierten ARRAY-, OBJECT-, oder VARIANT-Wert vergleichen.

Vergleich von strukturierten Werten mit anderen strukturierten Werten

Sie können zwei Werte desselben Typs vergleichen (z. B. zwei strukturierte ARRAY-Werte, zwei strukturierte OBJECT-Werte oder zwei MAP-Werte).

Derzeit werden die folgenden Vergleichsoperatoren für den Vergleich von Werten strukturierter Typen unterstützt:

  • =

  • !=

  • <

  • <=

  • >=

  • >

Wenn Sie zwei strukturierte Werte auf Gleichheit vergleichen, sollten Sie Folgendes beachten:

  • Wenn ein Typ nicht implizit in den anderen Typ umgewandelt werden kann (Koersion), schlägt der Vergleich fehl.

  • Wenn Sie MAP-Werte vergleichen, die numerische Schlüssel haben, werden die Schlüssel als Zahlen verglichen (nicht als VARCHAR-Werte).

Wenn Sie zwei strukturierte Werte mit <, <=, >= oder > vergleichen, werden die strukturierten Wertfelder in alphabetischer Reihenfolge verglichen. Zum Beispiel der folgende Wert:

{'a':2,'b':1}::OBJECT(b INTEGER,a INTEGER)
Copy

größer als:

{'a':1,'b':2}::OBJECT(b INTEGER,a INTEGER)
Copy

Feststellen, ob sich zwei ARRAY-Werte überlappen

Um festzustellen, ob sich die Elemente von zwei strukturierten ARRAY-Werten überlappen, rufen Sie die Funktion ARRAYS_OVERLAP auf. Beispiel:

SELECT ARRAYS_OVERLAP(numeric_array, other_numeric_array);
Copy

Die ARRAY-Werte müssen von vergleichbaren Typen sein.

Sie können dieser Funktion nicht einen semistrukturierten ARRAY-Wert und einen strukturierten ARRAY-Wert übergeben. Beide ARRAY-Werte müssen entweder strukturiert oder semistrukturiert sein.

Transformieren von Werten strukturierter Typen

In den folgenden Abschnitten wird erklärt, wie strukturierte ARRAY-, strukturierte OBJECT- und MAP-Werte transformiert werden:

Transformieren von strukturierten ARRAY-Werten

Wenn Sie einen strukturierten ARRAY-Wert an diese Funktionen übergeben, geben die Funktionen einen strukturierten ARRAY-Wert desselben Typs zurück:

In den nächsten Abschnitten wird erklärt, wie diese Funktionen mit strukturierten ARRAY-Werten funktionieren.

Funktionen, die Elemente zu ARRAY-Werten hinzufügen

Die folgenden Funktionen fügen Elemente zu einem ARRAY-Wert hinzu:

Für diese Funktionen muss der Typ des Elements implizit umwandelbar (Koersion) in den ARRAY-Typ sein.

Der folgende Aufruf ist zum Beispiel erfolgreich, weil ein NUMBER-Wert in einen DOUBLE-Wert (den Typ des ARRAY-Werts) umgewandelt werden kann:

SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), 3::NUMBER );
Copy

Der folgende Aufruf ist erfolgreich, weil VARCHAR-Werte implizit in DOUBLE-Werte umgewandelt werden können:

SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), '3' );
Copy

Der folgende Aufruf schlägt fehl, weil DATE-Werte nicht implizit in NUMBER-Werte umgewandelt werden können:

SELECT ARRAY_APPEND( [1,2]::ARRAY(NUMBER), '2022-02-02'::DATE );
Copy

Funktionen, die mehrere ARRAY-Werte als Eingabe akzeptieren

Die folgenden Funktionen akzeptieren mehrere ARRAY-Werte als Eingabeargumente:

Wenn Sie diese Funktionen aufrufen, müssen beide Argumente entweder strukturierte ARRAY-Werte oder semistrukturierte ARRAY-Werte sein. Die folgenden Aufrufe schlagen beispielsweise fehl, weil ein Argument ein strukturierter ARRAY-Wert und das andere Argument ein semistrukturierter ARRAY-Wert ist:

SELECT ARRAY_CAT( [1,2]::ARRAY(NUMBER), ['3','4'] );
Copy
SELECT ARRAY_CAT( [1,2], ['3','4']::ARRAY(VARCHAR) );
Copy

Die Funktion ARRAY_EXCEPT gibt einen ARRAY-Wert zurück, der vom gleichen Typ ist wie der ARRAY-Wert im ersten Argument.

Die Funktionen ARRAY_CAT und ARRAY_INTERSECTION geben einen ARRAY-Wert eines Typs zurück, der die Typen der beiden Eingabewerte aufnehmen kann.

Der folgende Aufruf von ARRAY_CAT übergibt zum Beispiel zwei strukturierte ARRAY-Werte:

  • Der erste strukturierte ARRAY-Wert lässt NULLs nicht zu und enthält NUMBER-Werte mit der Skala 0 (NUMBER(38, 0)).

  • Der zweite strukturierte ARRAY-Wert enthält einen NULL- und einen NUMBER-Wert, der eine Dezimalstellenzahl von 1 hat.

Der von ARRAY_CAT zurückgegebene ARRAY-Wert erlaubt NULLs und enthält NUMBER-Werte mit einer Dezimalstellenzahl von 1.

SELECT
  ARRAY_CAT(
    [1, 2, 3]::ARRAY(NUMBER NOT NULL),
    [5.5, NULL]::ARRAY(NUMBER(2, 1))
  ) AS concatenated_array,
  SYSTEM$TYPEOF(concatenated_array);
Copy
+--------------------+-----------------------------------+
| CONCATENATED_ARRAY | SYSTEM$TYPEOF(CONCATENATED_ARRAY) |
|--------------------+-----------------------------------|
| [                  | ARRAY(NUMBER(38,1))[LOB]          |
|   1,               |                                   |
|   2,               |                                   |
|   3,               |                                   |
|   5.5,             |                                   |
|   undefined        |                                   |
| ]                  |                                   |
+--------------------+-----------------------------------+

Für die Funktion ARRAY_CAT muss der ARRAY-Wert im zweiten Argument implizit umwandelbar in den Typ des ersten Arguments sein.

Bei den Funktionen ARRAY_EXCEPT und ARRAY_INTERSECTION muss der ARRAY-Wert des zweiten Arguments vergleichbar sein mit dem ARRAY-Wert des ersten Arguments sein.

Der folgende Aufruf ist zum Beispiel erfolgreich, weil ein ARRAY (NUMBER)-Wert mit einem ARRAY (DOUBLE)-Wert vergleichbar ist:

SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), [2,3]::ARRAY(DOUBLE) );
Copy

Der folgende Aufruf schlägt fehl, weil ein ARRAY (NUMBER)-Wert nicht mit einem ARRAY (VARCHAR)-Wert vergleichbar ist:

SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), ['2','3']::ARRAY(VARCHAR) );
Copy

Transformieren von strukturierten OBJECT-Werten

In den folgenden Abschnitten wird erklärt, wie ein strukturierter OBJECT-Wert zurückgegeben wird, der aus einem anderen OBJECT-Wert transformiert wurde:

Um die Reihenfolge der Schlüssel-Wert-Paare zu ändern, Schlüssel umzubenennen oder Schlüssel ohne Angabe von Werten hinzuzufügen, verwenden Sie die Funktion CAST oder den Operator ::. Weitere Details dazu finden Sie unter Umwandeln von einem strukturierten Typ in einen anderen.

Entfernen von Schlüssel-Wert-Paaren

Um einen neuen OBJECT-Wert zurückzugeben, das die Schlüssel-Wert-Paare eines bestehenden OBJECT-Werts enthält, wobei bestimmte Schlüssel-Wert-Paare entfernt werden, rufen Sie die Funktion OBJECT_DELETE auf.

Beim Aufrufen dieser Funktion ist Folgendes zu beachten:

  • Für die Argumente, die Schlüssel sind, müssen Sie Konstanten angeben.

  • Wenn der angegebene Schlüssel nicht Teil der OBJECT-Typdefinition ist, schlägt der Aufruf fehl. Der folgende Aufruf schlägt zum Beispiel fehl, weil der OBJECT-Wert nicht den angegebenen Schlüssel zip_code enthält:

    SELECT OBJECT_DELETE( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'zip_code' );
    
    Copy
    093201 (23001): Function OBJECT_DELETE: expected structured object to contain field zip_code but it did not.
    
  • Die Funktion gibt einen strukturierten OBJECT-Wert zurück. Der Typ des OBJECT-Werts schließt den gelöschten Schlüssel aus. Angenommen, Sie entfernen den Schlüssel city:

    SELECT
      OBJECT_DELETE(
        {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
        'city'
      ) AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy

    Die Funktion gibt einen OBJECT-Wert vom Typ OBJECT(state VARCHAR) zurück, der den Schlüssel city nicht enthält.

    +-----------------+--------------------------------------+
    | NEW_OBJECT      | SYSTEM$TYPEOF(NEW_OBJECT)            |
    |-----------------+--------------------------------------|
    | {               | OBJECT(state VARCHAR(16777216))[LOB] |
    |   "state": "CA" |                                      |
    | }               |                                      |
    +-----------------+--------------------------------------+
    
  • Wenn die Funktion alle Schlüssel aus dem OBJECT-Wert entfernt, gibt die Funktion einen leeren strukturierten OBJECT-Wert vom Typ OBJECT() zurück.

    SELECT
      OBJECT_DELETE(
        {'state':'CA'}::OBJECT(state VARCHAR),
        'state'
      ) AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy
    +------------+---------------------------+
    | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) |
    |------------+---------------------------|
    | {}         | OBJECT()[LOB]             |
    +------------+---------------------------+
    

    Wenn der Typ eines strukturierten OBJECT-Werts Schlüssel-Wert-Paare enthält, werden die Namen und Typen dieser Paare in Klammern in den Typ aufgenommen (zum Beispiel OBJECT(Stadt VARCHAR)). Da ein leerer strukturierter OBJECT-Wert keine Schlüssel-Wert-Paare enthält, sind die Klammern leer.

Einfügen von Schlüssel-Wert-Paaren und Aktualisieren von Werten

Um einen neuen OBJECT-Wert zurückzugeben, der die Schlüssel-Wert-Paare eines bestehenden OBJECT-Werts mit zusätzlichen Schlüssel-Wert-Paaren oder neuen Werten für Schlüssel enthält, rufen Sie die Funktion OBJECT_INSERT auf.

Beim Aufrufen dieser Funktion ist Folgendes zu beachten:

  • Für die Argumente, die Schlüssel sind, müssen Sie Konstanten angeben.

  • Wenn das Argument updateFlag den Wert FALSE hat (wenn Sie ein neues Schlüssel-Wert-Paar einfügen):

    • Wenn Sie einen Schlüssel angeben, der bereits im OBJECT-Wert vorhanden ist, tritt ein Fehler auf.

      SELECT OBJECT_INSERT(
        {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
        'city',
        'San Jose',
        false
      );
      
      Copy
      093202 (23001): Function OBJECT_INSERT:
        expected structured object to not contain field city but it did.
      
    • Die Funktion gibt einen strukturierten OBJECT-Wert zurück. Der Typ des OBJECT-Werts enthält den neu eingefügten Schlüssel. Angenommen, Sie fügen den Schlüssel zipcode mit dem FLOAT-Wert 94402 hinzu:

      SELECT
        OBJECT_INSERT(
          {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR),
          'zip_code',
          94402::FLOAT,
          false
        ) AS new_object,
        SYSTEM$TYPEOF(new_object) AS type;
      
      Copy
      +-------------------------------------+---------------------------------------------------------------------------------------+
      | NEW_OBJECT                          | TYPE                                                                                  |
      |-------------------------------------+---------------------------------------------------------------------------------------|
      | {                                   | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216), zip_code FLOAT NOT NULL)[LOB] |
      |   "city": "San Mateo",              |                                                                                       |
      |   "state": "CA",                    |                                                                                       |
      |   "zip_code": 9.440200000000000e+04 |                                                                                       |
      | }                                   |                                                                                       |
      +-------------------------------------+---------------------------------------------------------------------------------------+
      

      Der Typ des eingefügten Wertes bestimmt den Typ, der der OBJECT-Typdefinition hinzugefügt wird. In diesem Fall ist der Wert für zipcode ein in FLOAT umgewandelter Wert, sodass zipcode den Typ FLOAT hat.

  • Wenn das Argument updateFlag den Wert TRUE hat (wenn Sie ein vorhandenes Schlüssel-Wert-Paar ersetzen):

    • Wenn Sie einen Schlüssel angeben, der im OBJECT-Wert nicht vorhanden ist, tritt ein Fehler auf.

    • Die Funktion gibt einen strukturierten OBJECT-Wert desselben Typs zurück.

    • Der Typ des eingefügten Wertes wird implizit umgewandelt (Koersion) in den Typ des vorhandenen Schlüssels.

Auswählen von Schlüssel-Wert-Paaren aus einem bestehenden OBJECT

Um einen neuen OBJECT-Wert zurückzugeben, der ausgewählte Schlüssel-Wert-Paare aus einem bestehenden Wert OBJECT enthält, rufen Sie die Funktion OBJECT_PICK auf.

Beim Aufrufen dieser Funktion ist Folgendes zu beachten:

  • Für die Argumente, die Schlüssel sind, müssen Sie Konstanten angeben.

  • Sie können kein ARRAY von Schlüsseln als zweites Argument übergeben. Sie müssen jeden Schlüssel als separates Argument angeben.

  • Die Funktion gibt einen strukturierten OBJECT-Wert zurück. Der Typ des OBJECT-Werts enthält die Schlüssel in der Reihenfolge, in der sie angegeben sind.

    Angenommen, Sie wählen die Schlüssel state und city in dieser Reihenfolge aus:

    SELECT
      OBJECT_PICK(
        {'city':'San Mateo','state':'CA','zip_code':94402}::OBJECT(city VARCHAR,state VARCHAR,zip_code DOUBLE),
        'state',
        'city') AS new_object,
      SYSTEM$TYPEOF(new_object);
    
    Copy

    Die Funktion gibt einen OBJECT-Wert vom Typ OBJECT(state VARCHAR, city VARCHAR) zurück.

    +-----------------------+--------------------------------------------------------------+
    | NEW_OBJECT            | SYSTEM$TYPEOF(NEW_OBJECT)                                    |
    |-----------------------+--------------------------------------------------------------|
    | {                     | OBJECT(state VARCHAR(16777216), city VARCHAR(16777216))[LOB] |
    |   "state": "CA",      |                                                              |
    |   "city": "San Mateo" |                                                              |
    | }                     |                                                              |
    +-----------------------+--------------------------------------------------------------+
    

Transformieren von MAP-Werten

Um MAP-Werte zu transformieren, verwenden Sie die folgenden Funktionen:

Verwenden von strukturierten Typen

In den folgenden Abschnitten wird erklärt, wie verschiedene SQL-Funktionen und Mengenoperatoren mit Werten strukturierter Typen verwendet:

Verwenden der Funktion FLATTEN mit Werten von strukturierten Typen

Sie können strukturierte ARRAY-, strukturierte OBJECT-, und MAP-Werte an die Funktion FLATTEN übergeben. Wie bei semistrukturierten Datentypen können Sie das Argument PATH verwenden, um den zu vereinfachenden Wert anzugeben.

  • Wenn der zu vereinfachende Wert ein strukturierter ARRAY-Wert ist und das Argument RECURSIVE den Wert FALSE hat, enthält die Spalte value einen Wert desselben Typs wie der ARRAY-Wert.

    Beispiel:

    SELECT value, SYSTEM$TYPEOF(value)
      FROM TABLE(FLATTEN(INPUT => [1.08, 2.13, 3.14]::ARRAY(DOUBLE)));
    
    Copy
    +-------+----------------------+
    | VALUE | SYSTEM$TYPEOF(VALUE) |
    |-------+----------------------|
    |  1.08 | FLOAT[DOUBLE]        |
    |  2.13 | FLOAT[DOUBLE]        |
    |  3.14 | FLOAT[DOUBLE]        |
    +-------+----------------------+
    
  • Wenn der zu vereinfachende Wert ein MAP-Wert ist und das Argument RECURSIVE FALSE ist, enthält die key-Spalte einen Schlüssel desselben Typs wie der MAP-Schlüssel, und die value-Spalte enthält einen Wert desselben Typs wie der MAP-Wert.

    Beispiel:

    SELECT key, SYSTEM$TYPEOF(key), value, SYSTEM$TYPEOF(value)
      FROM TABLE(FLATTEN(INPUT => {'my_key': 'my_value'}::MAP(VARCHAR, VARCHAR)));
    
    Copy
    +--------+------------------------+----------+------------------------+
    | KEY    | SYSTEM$TYPEOF(KEY)     | VALUE    | SYSTEM$TYPEOF(VALUE)   |
    |--------+------------------------+----------+------------------------|
    | my_key | VARCHAR(16777216)[LOB] | my_value | VARCHAR(16777216)[LOB] |
    +--------+------------------------+----------+------------------------+
    
  • Ansonsten haben die Spalten key und value den Typ VARIANT.

Bei MAP-Werten ist die Reihenfolge der zurückgegebenen Schlüssel und Werte unbestimmt.

Verwenden der Funktion PARSE_JSON

Die Funktion PARSE_JSON gibt keine strukturierten Typen zurück.

Verwenden strukturierter Typen mit Mengenoperatoren und CASE-Ausdrücken

Sie können strukturierte ARRAY-, strukturierte OBJECT- und MAP-Werte für Folgendes verwenden:

Wenn bei Mengenoperatoren unterschiedliche Typen in den verschiedenen Ausdrücken verwendet werden (z. B. wenn ein Typ ARRAY(NUMBER) und der andere ARRAY(DOUBLE) ist), wird ein Typ implizit umgewandelt in den anderen Typ.

Arbeiten mit anderen semistrukturierten Funktionen

Die folgenden Funktionen akzeptieren keine strukturierten ARRAY-, strukturierten OBJECT- oder MAP-Werte als Eingabeargument:

Die Übergabe eines Werts von einem strukturierten Typ als Eingabe führt zu einem Fehler.

Zugriff auf strukturierte Typen in Anwendungen mit Treibern

In Anwendungen, die Treiber verwenden (z. B. den ODBC- oder JDBC-Treiber, den Snowflake Connector for Python usw.), werden strukturierte Typwerte als semistrukturierte Typen zurückgegeben. Beispiel:

  • Die Werte in einer strukturierten ARRAY-Spalte werden als semistrukturierte ARRAY-Werte an die Client-Anwendung zurückgegeben.

  • Die Werte in einer strukturierten OBJECT- oder MAP-Spalte werden als semistrukturierte OBJECT-Werte an die Client-Anwendung zurückgegeben.

Bemerkung

Bei Client-Anwendungen, die den JDBC-Treiber verwenden, gibt die Methode ResultSet.getArray() einen Fehler zurück, wenn die Abfrageergebnisse, die Sie abrufen möchten, einen strukturierten ARRAY-Wert mit NULL-Werten enthalten.

Um stattdessen eine String-Darstellung abzurufen, verwenden Sie die Methode ResultSet.getString():

String result = resultSet.getString(1);
Copy

Verwenden strukturierter Typen mit benutzerdefinierten Funktionen (UDFs) und gespeicherten Prozeduren

Wenn Sie eine benutzerdefinierte Funktion (UDF), eine benutzerdefinierte Tabellenfunktion (UDTF) oder eine gespeicherte Prozedur in SQL, Snowflake Scripting, Java, Python oder Scala erstellen, können Sie strukturierte Typen in den Argumenten und Rückgabewerten verwenden. Beispiel:

CREATE OR REPLACE FUNCTION my_udf(
    location OBJECT(city VARCHAR, zipcode NUMBER, val ARRAY(BOOLEAN)))
  RETURNS VARCHAR
  AS
  $$
    ...
  $$;
Copy
CREATE OR REPLACE FUNCTION my_udtf(check BOOLEAN)
  RETURNS TABLE(col1 ARRAY(VARCHAR))
  AS
  $$
  ...
  $$;
Copy
CREATE OR REPLACE PROCEDURE my_procedure(values ARRAY(INTEGER))
  RETURNS ARRAY(INTEGER)
  LANGUAGE SQL
  AS
  $$
    ...
  $$;
Copy
CREATE OR REPLACE FUNCTION my_function(values ARRAY(INTEGER))
  RETURNS ARRAY(INTEGER)
  LANGUAGE PYTHON
  RUNTIME_VERSION=3.10
  AS
  $$
    ...
  $$;
Copy

Bemerkung

Strukturierte Typen werden in UDFs, UDTFs und gespeicherte Prozeduren in JavaScript noch nicht unterstützt.

Anzeigen von Informationen zu strukturierten Typen

In den folgenden Abschnitten werden die Ansichten und Befehle beschrieben, die Sie verwenden können, um Informationen zu strukturierte Typen anzuzeigen:

Verwenden des Befehls SHOW COLUMNS zum Anzeigen strukturierter Typinformationen

In der Ausgabe des Befehls SHOW COLUMNS enthält die Spalte data_type Informationen zu den Typen der Elemente, Schlüssel und Werte.

Verwenden der DESCRIBE- und anderer SHOW-Befehle zum Anzeigen von Informationen zu strukturierten Typen

Die Ausgabe der folgenden Befehle enthält Informationen zu strukturierten Typen:

In der DESCRIBE RESULT-Ausgabe enthält die Zeile für eine Spalte vom Typ MAP(VARCHAR, VARCHAR) beispielsweise den folgenden Wert in der Spalte type:

map(VARCHAR(16777216), VARCHAR(16777216))
Copy

Die Zeile für eine ARRAY(NUMBER)-Spalte enthält den folgenden Wert in der type-Spalte:

ARRAY(NUMBER(38,0))
Copy

Anzeigen von Informationen zu den in einer Datenbank verwendeten strukturierten Typen

Bei Spalten mit strukturierten Typen liefert die Ansicht COLUMNS von INFORMATION_SCHEMA nur Informationen zu den Basisdatentyp der Spalte (ARRAY, OBJECT oder MAP).

Die Spalte data_type enthält zum Beispiel nur ARRAY, OBJECT oder MAP. Die Spalte enthält nicht die Typen der Elemente, Schlüssel oder Werte.

Um Informationen zu den Typen der Elemente, Schlüssel und Werte anzuzeigen, verwenden Sie die folgenden Ansichten: