Types de données structurés¶
Les types structurés Snowflake sont ARRAY, OBJECT et MAP. Les types structurés contiennent des éléments ou des paires clé-valeur avec des types de données Snowflake. Voici quelques exemples de types structurés :
Un ARRAY d’éléments INTEGER.
Un OBJECT avec des paires clé-valeur VARCHAR et NUMBER.
Une MAP qui associe une clé VARCHAR à une valeur DOUBLE.
Vous pouvez utiliser les types structurés des manières suivantes :
Vous pouvez définir une colonne de type structuré dans une table Apache Iceberg.
Les types de données Apache Iceberg
list
,struct
etmap
correspondent aux types de ARRAY structuré, d’OBJECT structuré et de MAP dans Snowflake.Une colonne de type structuré prend en charge un maximum de 1 000 sous-colonnes.
Les types structurés sont utilisés pour accéder aux données d’une colonne de type structuré dans une table Iceberg.
Vous pouvez transformer un type semi-structuré ARRAY, OBJECT ou VARIANT en un type structuré correspondant (par exemple, une valeur ARRAY en une valeur ARRAY d’éléments INTEGER). Vous pouvez également obtenir un type structuré d’un type semi-structuré.
Note
Actuellement, les tables autres que les tables Iceberg ne prennent pas en charge les types structurés. Vous ne pouvez pas ajouter une colonne d’un type structuré à une table standard.
Cette rubrique explique comment utiliser les types structurés dans Snowflake.
Spécification d’un type structuré¶
Lors de la définition d’une colonne de type structuré ou de la conversion d’une valeur en un type structuré, utilisez la syntaxe décrite dans les sections suivantes :
Spécification d’un type ARRAY structuré¶
Pour spécifier un type ARRAY structuré, utilisez la syntaxe suivante :
ARRAY( <element_type> [ NOT NULL ] )
Où :
element_type
est le type de données Snowflake des éléments de ce ARRAY.Vous pouvez également spécifier un ARRAY structuré, un OBJECT structuré ou un MAP comme type d’élément.
Note
Dans la définition d’une colonne de table Iceberg, vous ne pouvez pas spécifier un VARIANT, un ARRAY semi-structuré ou un OBJECT semi-structuré comme type de l’élément ARRAY.
NOT NULL spécifie que le ARRAY ne peut contenir aucun élément qui soit NULL.
Par exemple, comparez les types renvoyés par la fonction SYSTEM$TYPEOF dans l’instruction suivante :
La première expression de colonne transforme une valeur ARRAY semi-structurée en une valeur ARRAY structurée (un ARRAY de NUMBER éléments).
La deuxième expression de colonne spécifie une valeur ARRAY semi-structurée.
SELECT
SYSTEM$TYPEOF(
[1, 2, 3]::ARRAY(NUMBER)
) AS structured_array,
SYSTEM$TYPEOF(
[1, 2, 3]
) AS semi_structured_array;
+-------------------------------+-----------------------+
| STRUCTURED_ARRAY | SEMI_STRUCTURED_ARRAY |
|-------------------------------+-----------------------|
| ARRAY(NUMBER(38,0))[LOB] | ARRAY[LOB] |
+-------------------------------+-----------------------+
Spécification d’un type OBJECT structuré¶
Pour spécifier un type OBJECT structuré, utilisez la syntaxe suivante :
OBJECT(
[
<key> <value_type> [ NOT NULL ]
[ , <key> <value_type> [ NOT NULL ] ]
[ , ... ]
]
)
Où :
key
spécifie une clé pour le type OBJECT.Chaque
key
d’une définition d’OBJECT doit être unique.L’ordre des clés fait partie de la définition d’OBJECT. Il n’est pas autorisé de comparer deux valeurs OBJECT qui ont les mêmes clés dans un ordre différent. (Il se produit une erreur de temps de compilation.)
Si vous ne spécifiez aucune clé, mais que vous spécifiez les parenthèses (c’est-à-dire si vous utilisez
OBJECT()
), le type obtenu est un OBJECT structuré qui ne contient aucune clé. Un OBJECT structuré sans clé est différent d’un OBJECT semi-structuré.
value_type
est le type de données Snowflake de la valeur correspondant à la clé.Vous pouvez également spécifier un ARRAY structuré, un OBJECT structuré ou un MAP comme type de valeur.
Note
Dans la définition d’une colonne de table Iceberg, vous ne pouvez pas spécifier un VARIANT, un ARRAY semi-structuré ou un OBJECT semi-structuré comme type de la valeur correspondant à la clé OBJECT.
NOT NULL spécifie que la valeur correspondant à la clé ne peut pas être NULL.
Par exemple, comparez les types renvoyés par la fonction SYSTEM$TYPEOF dans l’instruction suivante :
La première expression de colonne transforme une valeur OBJECT semi-structurée en une valeur OBJECT structurée qui contient les clés et les valeurs suivantes :
Une clé nommée
str
avec une valeur VARCHAR qui n’est pas NULL.Une clé nommée
num
avec une valeur NUMBER.
La deuxième expression de colonne spécifie une valeur OBJECT semi-structurée.
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;
+---------------------------------------------------------------+------------------------+
| STRUCTURED_OBJECT | SEMI_STRUCTURED_OBJECT |
|---------------------------------------------------------------+------------------------|
| OBJECT(str VARCHAR(16777216) NOT NULL, num NUMBER(38,0))[LOB] | OBJECT[LOB] |
+---------------------------------------------------------------+------------------------+
Spécification d’un type MAP¶
Pour spécifier un type MAP, utilisez la syntaxe suivante :
MAP( <key_type> , <value_type> [ NOT NULL ] )
Où :
key_type
est le type de données Snowflake de la clé de la carte. Vous devez utiliser un des types suivants pour les clés :VARCHAR
NUMBER avec l’échelle 0
Vous ne pouvez pas utiliser un type de données à virgule flottante comme type de clé.
Les clés de carte ne peuvent pas être NULL.
value_type
est le type de données Snowflake des valeurs de map.Vous pouvez également spécifier un ARRAY structuré, un OBJECT structuré ou un MAP comme type de valeurs.
Note
Dans la définition d’une colonne de table Iceberg, vous ne pouvez pas spécifier un VARIANT, un ARRAY semi-structuré ou un OBJECT semi-structuré comme type de valeur dans le MAP.
NOT NULL spécifie que la valeur correspondant à la clé ne peut pas être NULL.
L’exemple suivant transforme une valeur OBJECT semi-structurée en une valeur MAP et utilise la fonction SYSTEM$TYPEOF pour imprimer le type obtenu de la valeur. La MAP associe les clés VARCHAR à des valeurs VARCHAR.
SELECT
SYSTEM$TYPEOF(
{
'a_key': 'a_val',
'b_key': 'b_val'
}::MAP(VARCHAR, VARCHAR)
) AS map_example;
+------------------------------------------------+
| MAP_EXAMPLE |
|------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+
Utilisation de types structurés dans des types semi-structurés¶
Vous ne pouvez pas utiliser un MAP, un OBJECT structuré ou une valeur ARRAY structurée dans une VARIANT, un OBJECT semi-structuré ou un valeur ARRAY semi-structurée. Une erreur se produit dans les situations suivantes :
Vous utilisez une MAP, un OBJECT structuré ou une valeur ARRAY structurée dans une constante d’OBJECT ou une constante de ARRAY.
Vous transmettez une MAP, un OBJECT structuré ou une valeur ARRAY structurée à une fonction constructrice d’OBJECT ou de ARRAY.
Conversion de types structurés et semi-structurés¶
Le tableau suivant résume les règles de conversion d’OBJECT structurés, de valeurs ARRAY structurées et de valeurs MAP en valeurs OBJECT, ARRAY et VARIANT semi-structurées (et inversement).
Type de données source |
Type de données cible |
||
---|---|---|---|
Valeur ARRAY semi-structurée |
ARRAY structuré |
✔ |
❌ |
Valeur OBJECT semi-structurée |
|
✔ |
❌ |
Valeur VARIANT semi-structurée |
|
✔ |
❌ |
ARRAY structuré |
Valeur ARRAY semi-structurée |
✔ |
❌ |
|
Valeur OBJECT semi-structurée |
✔ |
❌ |
|
Valeur VARIANT semi-structurée |
✔ |
❌ |
Les sections suivantes expliquent ces règles plus en détail.
Conversion explicite d’un type semi-structuré en un type structuré
Conversion explicite d’un type structuré en un type semi-structuré
Conversion explicite d’un type semi-structuré en un type structuré¶
Pour convertir explicitement une valeur d’un type semi-structuré en valeur d’un type structuré, vous pouvez appeler la fonction CAST ou utiliser l’opérateur ::.
Note
TRY_CAST n’est pas pris en charge pris en charge pour les types structurés.
Vous pouvez uniquement convertir les valeurs des types semi-structurés suivants en valeurs de type structuré correspondant ; sinon, il se produit une erreur d’exécution.
Type semi-structuré |
Type structuré que vous pouvez convertir en |
---|---|
ARRAY |
ARRAY structuré |
OBJECT |
MAP ou OBJECT structuré |
VARIANT |
MAP ou ARRAY ou OBJECT structuré |
Les sections suivantes fournissent plus de détails sur la façon dont les types sont convertis :
Conversion de valeurs ARRAY et VARIANT semi-structurées en valeurs ARRAY structurées
Conversion de valeurs OBJECT et VARIANT semi-structurées en valeurs OBJECT structurées
Conversion de valeurs OBJECT et VARIANT semi-structurées en valeurs MAP
Conversion de valeurs ARRAY et VARIANT semi-structurées en valeurs ARRAY structurées¶
Les étapes suivantes montrent comment transformer une valeur ARRAY ou VARIANT semi-structurée en valeur ARRAY de NUMBER éléments :
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;
Ou :
SELECT
SYSTEM$TYPEOF(
[1,2,3]::ARRAY(NUMBER)
) AS array_cast_type,
SYSTEM$TYPEOF(
[1,2,3]::VARIANT::ARRAY(NUMBER)
) AS variant_cast_type;
+--------------------------+--------------------------+
| ARRAY_CAST_TYPE | VARIANT_CAST_TYPE |
|--------------------------+--------------------------|
| ARRAY(NUMBER(38,0))[LOB] | ARRAY(NUMBER(38,0))[LOB] |
+--------------------------+--------------------------+
Lorsque vous transformez une valeur ARRAY ou VARIANT semi-structurée en valeur ARRAY structurée, notez les points suivants :
Chaque élément de la valeur ARRAY est converti dans le type spécifié du ARRAY.
La transformation de la colonne de ARRAY en ARRAY(VARCHAR) convertit chaque valeur en valeur VARCHAR :
SELECT CAST ([1,2,3] AS ARRAY(VARCHAR)) AS varchar_array, SYSTEM$TYPEOF(varchar_array) AS array_cast_type;
+---------------+-------------------------------+ | VARCHAR_ARRAY | ARRAY_CAST_TYPE | |---------------+-------------------------------| | [ | ARRAY(VARCHAR(16777216))[LOB] | | "1", | | | "2", | | | "3" | | | ] | | +---------------+-------------------------------+
Si l’élément ne peut pas être converti dans le type spécifié (par exemple, conversion de
['a', 'b', 'c']
en ARRAY(NUMBER)), la conversion échoue.Si la valeur ARRAY contient des éléments NULL et que le type de ARRAY spécifie NOT NULL (par exemple, conversion de
[1, NULL, 3]
en ARRAY(NUMBER NOT NULL), la conversion échoue.Les éléments qui sont des valeurs JSON nulles sont convertis en NULL si le type d’élément cible ne prend pas en charge les valeurs JSON nulles (c’est-à-dire si le type cible n’est pas un ARRAY, un OBJECT ou une VARIANT semi-structuré(e)).
Par exemple, si vous effectuez une conversion vers ARRAY(NUMBER), les valeurs JSON nulles sont converties en NULL, car NUMBER ne prend pas en charge les valeurs JSON nulles.
En revanche, si vous effectuez une conversion vers ARRAY(VARIANT), les valeurs JSON nulles ne sont pas converties en NULL, car VARIANT prend en charge les valeurs JSON nulles.
Conversion de valeurs OBJECT et VARIANT semi-structurées en valeurs OBJECT structurées¶
Les étapes suivantes montrent comment transformer une valeur OBJECT ou VARIANT semi-structurée en une valeur OBJECT structurée contenant les paires clé-valeur city
et state
(qui sont des valeurs VARCHAR) :
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;
Ou :
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;
+--------------------------------------------------------------+--------------------------------------------------------------+
| OBJECT_CAST_TYPE | VARIANT_CAST_TYPE |
|--------------------------------------------------------------+--------------------------------------------------------------|
| OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] | OBJECT(city VARCHAR(16777216), state VARCHAR(16777216))[LOB] |
+--------------------------------------------------------------+--------------------------------------------------------------+
Lorsque vous transformez une valeur OBJECT ou VARIANT semi-structurée en valeur OBJECT structurée, notez les points suivants :
La valeur OBJECT ne peut pas contenir de clés supplémentaires non spécifiées dans le type OBJECT.
En cas de clés supplémentaires, la conversion échoue.
S’il manque à la valeur OBJECT une clé spécifiée dans le type OBJECT, la conversion échoue.
La valeur de chaque clé de le la valeur OBJECT est convertie dans le type spécifié pour cette clé.
Si une valeur ne peut être convertie en type spécifié, la conversion échoue.
Lorsque la valeur d’une clé est une valeur JSON nulle, la valeur est convertie en NULL, si le type de valeur cible ne prend pas en charge les valeurs JSON nulles (c’est-à-dire, si le type cible n’est pas un ARRAY, un OBJECT ou une VARIANT semi-structuré(e)).
Par exemple, si vous effectuez une conversion vers OBJECT(ville VARCHAR), les valeurs JSON nulles sont converties en NULL, car VARCHAR ne prend pas en charge les valeurs JSON nulles.
En revanche, si vous effectuez une conversion vers OBJECT(ville VARIANT), les valeurs JSON nulles ne sont pas converties en NULL, car VARIANT prend en charge les valeurs JSON nulles.
Conversion de valeurs OBJECT et VARIANT semi-structurées en valeurs MAP¶
Les instructions suivantes montrent comment transformer une valeur OBJECT ou VARIANT semi-structurée en valeur MAP qui associe une clé VARCHAR à une valeur VARCHAR :
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;
Ou :
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;
+------------------------------------------------+------------------------------------------------+
| MAP_CAST_TYPE | VARIANT_CAST_TYPE |
|------------------------------------------------+------------------------------------------------|
| MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] | MAP(VARCHAR(16777216), VARCHAR(16777216))[LOB] |
+------------------------------------------------+------------------------------------------------+
Lorsque vous transformez une valeur OBJECT ou VARIANT semi-structurée en valeur MAP, notez les points suivants :
Si les clés et les valeurs ne correspondent pas aux types spécifiés, elles sont converties dans les types spécifiés.
Si les clés et les valeurs ne peuvent pas être converties dans les types spécifiés, la conversion échoue.
Lorsque la valeur d’une clé est une valeur JSON nulle, la valeur est convertie en NULL, si le type de valeur cible ne prend pas en charge les valeurs JSON nulles (c’est-à-dire, si le type cible n’est pas un ARRAY, un OBJECT ou une VARIANT semi-structuré(e)).
Par exemple, si vous effectuez une conversion vers MAP(VARCHAR, VARCHAR), les valeurs JSON nulles sont converties en NULL, car VARCHAR ne prend pas en charge les valeurs JSON nulles.
En revanche, si vous effectuez une conversion vers MAP(VARCHAR, VARIANT), les valeurs JSON nulles ne sont pas converties en NULL, car VARIANT prend en charge les valeurs JSON nulles.
Conversion explicite d’un type structuré en un type semi-structuré¶
Pour convertir explicitement une valeur d’un type structuré en valeur d’un type semi-structuré, vous pouvez appeler la fonction CAST, utiliser l’opérateur :: ou appeler l’une des fonctions de conversion (par exemple, TO_ARRAY, TO_OBJECT ou TO_VARIANT).
Note
TRY_CAST n’est pas pris en charge avec les types structurés.
Type structuré |
Type semi-structuré que vous pouvez convertir en |
---|---|
ARRAY structuré |
ARRAY |
MAP ou OBJECT structuré |
OBJECT |
MAP, ARRAY structuré ou OBJECT structuré |
VARIANT |
Par exemple :
Si
col_structured_array
est du type ARRAY(VARCHAR) :CAST(tableau_structuré_col AS ARRAY) renvoie une valeur ARRAY semi-structurée.
CAST(tableau_structuré_col AS VARIANT) renvoie une valeur VARIANT contenant une valeur ARRAY semi-structurée.
Si
col_structured_object
est de type OBJECT(nom VARCHAR, état VARCHAR) :CAST(objet_structuré_col AS OBJECT) renvoie une valeur OBJECT semi-structurée.
CAST(objet_structuré_col AS VARIANT) renvoie une valeur VARIANT contenant une valeur OBJECT semi-structurée.
Si
col_map
est du type MAP(VARCHAR, VARCHAR) :CAST(carte_col AS OBJECT) renvoie une valeur OBJECT semi-structurée.
CAST(carte_col AS VARIANT) renvoie une valeur VARIANT contenant une valeur OBJECT semi-structurée.
Remarques :
Lorsque vous effectuez une conversion vers une valeur OBJECT semi-structurée, l’ordre des clés de la valeur OBJECT structurée n’est pas préservé.
Lorsque vous transformez une valeur OBJECT structurée ou une valeur MAP en valeur OBJECT ou VARIANT semi-structurée, toutes les valeurs NULL sont converties en valeurs JSON nulles.
Si vous transformez une valeur ARRAY structurée en valeur VARIANT, les valeurs NULL sont conservées telles quelles.
SELECT [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT;
+---------------------------------------+ | [1,2,NULL,3]::ARRAY(INTEGER)::VARIANT | |---------------------------------------| | [ | | 1, | | 2, | | undefined, | | 3 | | ] | +---------------------------------------+
Si vous transformez une valeur MAP qui utilise un type NUMBER pour les clés, les clés de la MAP sont converties en chaînes dans la valeur OBJECT renvoyée.
Conversion implicite d’une valeur (coercition)¶
Les règles suivantes s’appliquent au casting (à la conversion) implicite (coercition ou conversion contrainte) d’une valeur d’un type structuré en valeur d’un autre type structuré :
Un valeur de type structuré peut être contrainte à se transformer en un valeur d’un autre type structuré si les deux types de base sont identiques :
Une valeur ARRAY d’un type peut être contrainte à se transformer en une valeur ARRAY d’un autre type, à condition que le premier type d’élément puisse être contraint à se convertir dans le deuxième type d’élément.
Un type d’élément peut être contraint à se transformer en un autre type d’élément dans l’un ou l’autre des cas suivants :
Les deux types sont numériques. Les cas suivants sont pris en charge :
Les deux utilisent le même type de numérique, mais peuvent varier en termes de précision et/ou d’échelle.
Contrainte de transformation d’un NUMBER en FLOAT (et inversement).
Les deux types sont des horodatages. Les cas suivants sont pris en charge :
Les deux utilisent le même type, mais peuvent varier en termes de précision.
Contrainte de transformation d’un TIMESTAMP_LTZ en TIMESTAMP_TZ (et inversement).
Par exemple :
Une valeur ARRAY(NUMBER) peut être contrainte à se transformer en valeur ARRAY(DOUBLE).
Une valeur ARRAY(DATE) ne peut être contrainte à se transformer en valeur ARRAY(NUMBER).
Une valeur OBJECT avec une définition de type peut être contrainte à se transformer en valeur OBJECT avec une autre définition de type uniquement si toutes les conditions suivantes sont remplies :
Les deux types d’OBJECT ont le même nombre de clés.
Les deux types d’OBJECT utilisent les mêmes noms pour les clés.
Les clés des deux types d’OBJECT sont dans le même ordre.
Le type de chaque valeur d’un type d’OBJECT peut être contraint à se transformer dans le type de la valeur correspondante dans l’autre type d’OBJECT.
Comme c’est le cas pour les types d’élément des valeurs ARRAY structurées, vous pouvez contraindre le type d’une valeur à se transformer en un autre type uniquement si :
Les deux types sont numériques. Les cas suivants sont pris en charge :
Les deux utilisent le même type de numérique, mais peuvent varier en termes de précision et/ou d’échelle.
Contrainte de transformation d’un NUMBER en FLOAT (et inversement).
Les deux types sont des horodatages. Les cas suivants sont pris en charge :
Les deux utilisent le même type, mais peuvent varier en termes de précision.
Contrainte de transformation d’un TIMESTAMP_LTZ en TIMESTAMP_TZ (et inversement).
Par exemple :
Une valeur OBJECT(ville VARCHAR, code postal NUMBER) peut être contrainte à se transformer en une valeur OBJECT(ville VARCHAR, code postal DOUBLE).
Une valeur OBJECT(ville VARCHAR, code postal NUMBER) ne peut être contrainte à se transformer en une valeur OBJECT(ville VARCHAR, code postal DATE).
Une valeur MAP avec un type de valeur peut être contrainte à se transformer en valeur MAP avec un type de valeur différent si :
Les deux types de valeur sont numériques. Les cas suivants sont pris en charge :
Les deux utilisent le même type de numérique, mais peuvent varier en termes de précision et/ou d’échelle.
Contrainte de transformation d’un NUMBER en FLOAT (et inversement).
Les deux types de valeur sont des horodatages. Les cas suivants sont pris en charge :
Les deux utilisent le même type, mais peuvent varier en termes de précision.
Contrainte de transformation d’un TIMESTAMP_LTZ en TIMESTAMP_TZ (et inversement).
Par exemple, une valeur MAP(VARCHAR, NUMBER) peut être contrainte à se transformer en valeur MAP(VARCHAR, DOUBLE).
Une valeur MAP avec un type de clé peut être contrainte à se transformer en valeur MAP avec un type de clé différent si les deux types de clé utilisent le même type d’entier NUMERIC qui ne varie qu’en termes de précision.
Par exemple, une valeur MAP(VARCHAR, NUMBER) ne peut être contrainte à se transformer en valeur MAP(NUMBER, NUMBER).
Une valeur de type structuré ne peut pas être contrainte à se transformer en valeur semi-structurée (et inversement).
Une valeur VARCHAR ne peut être contrainte à se transformer en valeur de type structuré.
Conversion d’un type structuré en un autre¶
Vous pouvez appeler la fonction CAST ou utiliser l’opérateur :: pour convertir une valeur de type structuré en valeur d’un autre type structuré. Vous pouvez convertir des valeurs depuis et vers les types structurés suivants :
Pour les ARRAYs structurés :
Vous pouvez transformer une valeur ARRAY d’un type en valeur ARRAY d’un autre type.
Pour les OBJECTs structurés :
Vous pouvez utiliser une conversion pour modifier l’ordre des paires clé-valeur d’une valeur OBJECT.
Vous pouvez utiliser une conversion pour modifier les noms des clés d’une valeur OBJECT.
Vous pouvez utiliser une conversion pour ajouter des clés à une valeur OBJECT.
Vous pouvez transformer une valeur OBJECT structurée en valeur MAP.
Pour les valeurs MAP :
Vous pouvez convertir une valeur MAP avec des clés et des valeurs d’un type spécifique en valeur MAP avec des clés et des valeurs d’un type différent.
Vous pouvez transformer une valeur MAP en valeur OBJECT structurée.
Note
TRY_CAST n’est pas pris en charge avec les types structurés.
S’il n’est pas possible de convertir les valeurs d’un type à l’autre, la conversion échoue. Par exemple, la tentative de transformation d’une valeur ARRAY(BOOLEAN) en une valeur ARRAY(DATE) échoue.
Exemple : conversion d’un type de valeur ARRAY en un autre¶
L’exemple suivant transforme une valeur ARRAY(NUMBER) en valeur ARRAY(VARCHAR) :
SELECT CAST(
CAST([1,2,3] AS ARRAY(NUMBER))
AS ARRAY(VARCHAR)) AS cast_array;
+------------+
| CAST_ARRAY |
|------------|
| [ |
| "1", |
| "2", |
| "3" |
| ] |
+------------+
Exemple : modification de l’ordre des paires clé-valeur d’une valeur OBJECT¶
L’exemple suivant modifie l’ordre des paires clé-valeur d’une valeur OBJECT structurée :
SELECT CAST(
{'city': 'San Mateo','state': 'CA'}::OBJECT(city VARCHAR, state VARCHAR)
AS OBJECT(state VARCHAR, city VARCHAR)) AS object_value_order;
+-----------------------+
| OBJECT_VALUE_ORDER |
|-----------------------|
| { |
| "state": "CA", |
| "city": "San Mateo" |
| } |
+-----------------------+
Exemple : modification des noms de clé d’une valeur OBJECT¶
Pour modifier les noms de clé d’une valeur OBJECT structurée, spécifiez les mots-clés RENAME FIELDS à la fin de CAST. Par exemple :
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;
+-----------------------------+
| OBJECT_VALUE_KEY_NAMES |
|-----------------------------|
| { |
| "city_name": "San Mateo", |
| "state_name": "CA" |
| } |
+-----------------------------+
Exemple : ajout de clés à une valeur OBJECT¶
Si le type vers lequel vous effectuez la conversion comporte des paires clé-valeur supplémentaires qui ne sont pas présentes dans la valeur OBJECT structurée d’origine, spécifiez les mots-clés ADD FIELDS à la fin de CAST. Par exemple :
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;
+------------------------+
| ADD_FIELDS |
|------------------------|
| { |
| "city": "San Mateo", |
| "state": "CA", |
| "zipcode": null |
| } |
+------------------------+
Les valeurs des nouvelles clés ajoutées sont définies sur NULL. Si vous souhaitez attribuer une valeur à ces clés, appelez plutôt la fonction OBJECT_INSERT.
Construction de valeurs ARRAY structurées, de valeurs OBJECT structurées et de valeurs MAP¶
Les sections suivantes expliquent comment construire des valeurs ARRAY structurées, des valeurs OBJECT structurées et des valeurs MAP.
Utilisation de fonctions SQL pour construire des valeurs ARRAY et OBJECT structurées
Utilisation des constantes ARRAY et OBJECT pour construire des valeurs ARRAY et OBJECT structurées
Utilisation de fonctions SQL pour construire des valeurs ARRAY et OBJECT structurées¶
Les fonctions suivantes permettent de construire des valeurs ARRAY semi-structurées :
Les fonctions suivantes permettent de construire des valeurs OBJECT semi-structurées :
Pour construire une valeur ARRAY ou OBJECT structurée, utilisez ces fonctions et convertissez explicitement la valeur de retour de la fonction. Par exemple :
SELECT ARRAY_CONSTRUCT(10, 20, 30)::ARRAY(NUMBER);
SELECT OBJECT_CONSTRUCT(
'oname', 'abc',
'created_date', '2020-01-18'::DATE
)::OBJECT(
oname VARCHAR,
created_date DATE
);
Pour plus de détails, reportez-vous à Conversion explicite d’un type semi-structuré en un type structuré.
Note
Il n’est pas possible de transmettre des valeurs ARRAY structurées, des valeurs OBJECT structurées ou des valeurs MAP à ces fonctions. Si vous le faisiez, cela entraînerait le casting (la conversion) implicite d’un type structuré en type semi-structuré, ce qui n’est pas autorisé, comme indiqué à la section Conversion implicite d’une valeur (coercition).
Utilisation des constantes ARRAY et OBJECT pour construire des valeurs ARRAY et OBJECT structurées¶
Lorsque vous spécifiez une constante ARRAY ou une constante OBJECT, vous spécifiez une valeur ARRAY ou OBJECT semi-structurée.
Pour construire une valeur ARRAY ou OBJECT structurée, vous devez explicitement convertir l’expression. Par exemple :
SELECT [10, 20, 30]::ARRAY(NUMBER);
SELECT {
'oname': 'abc',
'created_date': '2020-01-18'::DATE
}::OBJECT(
oname VARCHAR,
created_date DATE
);
Pour plus de détails, reportez-vous à Conversion explicite d’un type semi-structuré en un type structuré.
Construire une valeur MAP¶
Pour construire une valeur MAP, construisez une valeur OBJECT semi-structurée et transformez la valeur OBJECT en valeur MAP.
Par exemple, les deux instructions suivantes la valeur MAP {'city'->'San Mateo','state'->'CA'}
:
SELECT OBJECT_CONSTRUCT(
'city', 'San Mateo',
'state', 'CA'
)::MAP(
VARCHAR,
VARCHAR
);
SELECT {
'city': 'San Mateo',
'state': 'CA'
}::MAP(
VARCHAR,
VARCHAR
);
L’instruction suivante produit la valeur MAP {-10->'CA',-20->'OR'}
:
SELECT {
'-10': 'CA',
'-20': 'OR'
}::MAP(
NUMBER,
VARCHAR
);
Pour plus de détails, reportez-vous à Conversion de valeurs OBJECT et VARIANT semi-structurées en valeurs MAP.
Utilisation de clés, de valeurs et d’éléments dans des valeurs de types structurés¶
Les sections suivantes expliquent comment utiliser des clés, des valeurs et des éléments dans valeurs de types structurés.
Obtention de la liste de clés à partir d’une valeur OBJECT structurée
Accès aux valeurs et aux éléments de valeurs des types structurés
Obtention de la liste de clés à partir d’une valeur OBJECT structurée¶
Pour obtenir la liste de clés d’une valeur OBJECT structurée, appelez la fonction OBJECT_KEYS :
SELECT OBJECT_KEYS({'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR, state VARCHAR));
Si l’entrée est une valeur OBJECT structurée, la fonction renvoie une valeur ARRAY(VARCHAR) contenant les clés. Si l’entrée est une valeur OBJECT semi-structurée, la fonction renvoie une valeur ARRAY.
Obtention de la liste de clés d’une valeur MAP¶
Pour obtenir la liste de clés d’une valeur MAP, appelez la fonction MAP_KEYS :
SELECT MAP_KEYS({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Accès aux valeurs et aux éléments de valeurs des types structurés¶
Vous pouvez utiliser les méthodes suivantes pour accéder aux valeurs et aux éléments de valeurs ARRAY structurées, de valeurs OBJECT structurées et de valeurs MAP :
La fonction GET
La fonction GET_IGNORE_CASE
La fonction GET_PATH
Les valeurs et les éléments renvoyés ont le type spécifié pour la valeur structurée, au lieu de VARIANT.
L’exemple suivant transmet le premier élément d’une valeur ARRAY semi-structurée et d’une valeur ARRAY(VARCHAR) à la fonction SYSTEM$TYPEOF pour qu’elle renvoie le type de données de cet élément :
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;
+-------------------------------+-----------------------------+
| SEMI_STRUCTURED_ARRAY_ELEMENT | STRUCTURED_ARRAY_ELEMENT |
|-------------------------------+-----------------------------|
| VARIANT[LOB] | VARCHAR(16777216)[LOB] |
+-------------------------------+-----------------------------+
Remarques :
Lorsque vous transmettez une valeur OBJECT structurée à la fonction GET ou GET_IGNORE_CASE, vous devez spécifier une constante pour la clé.
Il n’est pas nécessaire de spécifier une constante si vous transmettez une valeur MAP ou une valeur ARRAY structurée à la fonction GET.
Il n’est pas non plus nécessaire de spécifier une constante si vous transmettez une valeur MAP à la fonction GET_IGNORE_CASE.
Lorsque vous transmettez une valeur OBJECT structuré, une valeur ARRAY structurée ou une valeur MAP à la fonction GET_PATH, vous devez spécifier une constante pour le nom de chemin d’accès.
Pour un valeur OBJECT structurée, si vous utilisez une clé d’OBJECT ou un chemin d’accès qui n’existe pas, il se produit une erreur de temps de compilation.
En revanche, lorsque vous utilisez un index, une clé ou un chemin d’accès qui n’existe pas avec une valeur OBJECT semi-structurée, la fonction renvoie NULL.
Détermination de la taille d’une valeur ARRAY structurée¶
Pour déterminer la taille d’une valeur ARRAY structurée, transmettez la valeur ARRAY à la fonction ARRAY_SIZE :
SELECT ARRAY_SIZE([1,2,3]::ARRAY(NUMBER));
Détermination de la taille d’une valeur MAP¶
Pour déterminer la taille d’une valeur MAP, transmettez la valeur MAP à la fonction MAP_SIZE :
SELECT MAP_SIZE({'my_key':'my_value'}::MAP(VARCHAR,VARCHAR));
Recherche d’éléments dans une valeur ARRAY structurée¶
Pour déterminer si un élément est présent dans une valeur ARRAY structurée, appelez la fonction ARRAY_CONTAINS. Par exemple :
SELECT ARRAY_CONTAINS(10, [1, 10, 100]::ARRAY(NUMBER));
Pour déterminer la position d’un élément dans une valeur ARRAY structurée, appelez la fonction ARRAY_POSITION. Par exemple :
SELECT ARRAY_POSITION(10, [1, 10, 100]::ARRAY(NUMBER));
Note
Pour les deux fonctions, utilisez un élément d”un type comparable au type de la valeur ARRAY.
Ne convertissez pas l’expression de l’élément en valeur VARIANT.
Détermination si une valeur MAP contient une clé¶
Pour déterminer si une valeur MAP contient une clé, appelez la fonction MAP_CONTAINS_KEY :
Par exemple :
SELECT MAP_CONTAINS_KEY('key_to_find', my_map);
SELECT MAP_CONTAINS_KEY(10, my_map);
Comparaison des valeurs¶
Les sections suivantes expliquent comment comparer des valeurs :
Comparaison des valeurs structurées avec des valeurs semi-structurées
Comparaison des valeurs structurées avec d’autres valeurs structurées
Comparaison des valeurs structurées avec des valeurs semi-structurées¶
Vous ne pouvez pas comparer une valeur ARRAY structurée, une valeur OBJECT structurée ou une valeur MAP à une valeur ARRAY, une valeur OBJECT ou une valeur VARIANT semi-structurée.
Comparaison des valeurs structurées avec d’autres valeurs structurées¶
Vous pouvez comparer deux valeurs du même type (par exemple, deux valeurs ARRAY structurées, deux valeurs OBJECT structurées ou deux valeurs MAP).
Actuellement, les opérateurs de comparaison suivants sont pris en charge pour comparer les valeurs des types structurés :
=
!=
<
<=
>=
>
Lorsque vous comparez deux valeurs structurées pour voir dans quelle mesure ils sont égaux, notez les points suivants :
Si un type ne peut être contraint à se transformer dans l’autre type, la comparaison échoue.
Lorsque vous comparez des valeurs MAP qui ont des clés numériques, les clés sont comparées en tant que nombres (et non en tant que valeurs VARCHAR).
Lorsque vous comparez deux valeurs structurées via <
, <=
, >=
ou >
, les champs de valeur structurée sont comparés dans l’ordre alphabétique. Par exemple, la valeur suivante :
{'a':2,'b':1}::OBJECT(b INTEGER,a INTEGER)
est supérieur à :
{'a':1,'b':2}::OBJECT(b INTEGER,a INTEGER)
Détermination si deux valeurs ARRAY se chevauchent¶
Pour déterminer si les éléments de deux valeurs ARRAY structurées se chevauchent, appelez la fonction ARRAYS_OVERLAP. Par exemple :
SELECT ARRAYS_OVERLAP(numeric_array, other_numeric_array);
Les valeurs ARRAY doivent être de types comparables à.
Vous ne pouvez pas transmettre une valeur ARRAY semi-structurée et une valeur ARRAY structurée à cette fonction. Les deux valeurs ARRAY doivent être soit structurées soit semi-structurées.
Transformation de valeurs de types structurés¶
Les sections suivantes expliquent comment transformer des valeurs ARRAY structurées, des valeurs OBJECT structurées et des valeurs MAP :
Transformation de valeurs ARRAY structurées¶
Lorsque vous transmettez une valeur ARRAY structurée à ces fonctions, celles-ci renvoient une valeur ARRAY structurée du même type :
Les sections suivantes expliquent comment ces fonctions fonctionnent avec les valeurs ARRAY structurées.
Fonctions qui ajoutent des éléments à des valeurs ARRAY¶
Les fonctions suivantes ajoutent des éléments à des valeurs ARRAY :
Pour ces fonctions, le type de l’élément doit pouvoir être contraint à se transformer dans le type de la valeur ARRAY.
Par exemple, l’appel suivant fonctionne, parce qu’une valeur NUMBER peut être contrainte à se transformer en valeur DOUBLE (le type de la valeur ARRAY) :
SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), 3::NUMBER );
L’appel suivant fonctionne, parce que les valeurs VARCHAR peuvent être contraintes à se transformer en valeurs DOUBLE :
SELECT ARRAY_APPEND( [1,2]::ARRAY(DOUBLE), '3' );
L’appel suivant échoue, car les valeurs DATE ne peuvent pas être contraintes à se transformer en valeurs NUMBER :
SELECT ARRAY_APPEND( [1,2]::ARRAY(NUMBER), '2022-02-02'::DATE );
Fonctions acceptant plusieurs valeurs ARRAY en entrée¶
Les fonctions suivantes acceptent plusieurs valeurs ARRAY comme arguments d’entrée :
Lorsque vous appelez ces fonctions, les deux arguments doivent être des valeurs ARRAY structurées ou des valeurs ARRAY semi-structurées. Par exemple, les appels suivants échouent, parce que l’un des arguments est une valeur ARRAY structurée et l’autre une valeur ARRAY semi-structurée :
SELECT ARRAY_CAT( [1,2]::ARRAY(NUMBER), ['3','4'] );
SELECT ARRAY_CAT( [1,2], ['3','4']::ARRAY(VARCHAR) );
La fonction ARRAY_EXCEPT renvoie une valeur ARRAY du même type que la valeur ARRAY du premier argument.
Les fonctions ARRAY_CAT et ARRAY_INTERSECTION renvoient une valeur ARRAY d’un type qui peut prendre en charge les types des deux valeurs d’entrée.
Par exemple, l’appel suivant à ARRAY_CAT transmet deux valeurs ARRAY structurées :
La première valeur ARRAY structurée n’autorise pas les valeurs NULLs et contient des valeurs NUMBER avec l’échelle de 0 (NUMBER(38, 0)).
La deuxième valeur ARRAY structurée contient une valeur NULL et une valeur NUMBER qui a l’échelle de 1.
La valeur ARRAY renvoyée par ARRAY_CAT accepte les valeurs NULLs et contient des valeurs NUMBER avec l’échelle de 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);
+--------------------+-----------------------------------+
| CONCATENATED_ARRAY | SYSTEM$TYPEOF(CONCATENATED_ARRAY) |
|--------------------+-----------------------------------|
| [ | ARRAY(NUMBER(38,1))[LOB] |
| 1, | |
| 2, | |
| 3, | |
| 5.5, | |
| undefined | |
| ] | |
+--------------------+-----------------------------------+
Pour la fonction ARRAY_CAT, la valeur ARRAY du deuxième argument doit pouvoir être contrainte de se transformer dans le type du premier argument.
Pour les fonctions ARRAY_EXCEPT et ARRAY_INTERSECTION, la valeur ARRAY du deuxième argument doit être comparable à la valeur ARRAY du premier argument.
Par exemple, l’appel suivant fonctionne, parce qu’une valeur ARRAY(NUMBER) est comparable à une valeur ARRAY(DOUBLE) :
SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), [2,3]::ARRAY(DOUBLE) );
L’appel suivant échoue, parce qu’une valeur ARRAY(NUMBER) n’est pas comparable à une valeur ARRAY(VARCHAR) :
SELECT ARRAY_EXCEPT( [1,2]::ARRAY(NUMBER), ['2','3']::ARRAY(VARCHAR) );
Transformation de valeurs OBJECT structurées¶
Les sections suivantes expliquent comment retourner une valeur OBJECT structurée qui a été transformée à partir d’une autre valeur OBJECT :
Pour modifier l’ordre des paires clé-valeur, renommer des clés ou ajouter des clés sans spécifier de valeurs, utilisez la fonction CAST ou l’opérateur ::. Pour plus de détails, voir Conversion d’un type structuré en un autre.
Suppression de paires clé-valeur¶
Pour renvoyer une nouvelle valeur OBJECT contenant les paires clé-valeur d’une valeur OBJECT existante dont certaines paires clé-valeur ont été supprimées, appelez la fonction OBJECT_DELETE.
Lors de l’appel de cette fonction, notez les points suivants :
Pour les arguments qui sont des clés, vous devez spécifier des constantes.
Si la clé spécifiée ne fait pas partie de la définition de type OBJECT, l’appel échoue. Par exemple, l’appel suivant échoue, car la valeur OBJECT ne contient pas la clé spécifiée
zip_code
:SELECT OBJECT_DELETE( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'zip_code' );
093201 (23001): Function OBJECT_DELETE: expected structured object to contain field zip_code but it did not.
La fonction renvoie une valeur OBJECT structurée. Le type de la valeur OBJECT exclut la clé supprimée. Supposons, par exemple, que vous supprimiez la clé
city
:SELECT OBJECT_DELETE( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'city' ) AS new_object, SYSTEM$TYPEOF(new_object);
La fonction renvoie une valeur OBJECT du type
OBJECT(state VARCHAR)
, qui ne comprend pas la clécity
.+-----------------+--------------------------------------+ | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) | |-----------------+--------------------------------------| | { | OBJECT(state VARCHAR(16777216))[LOB] | | "state": "CA" | | | } | | +-----------------+--------------------------------------+
Si la fonction supprime toutes les clés de la valeur OBJECT, elle renvoie une valeur OBJECT structurée vide du type
OBJECT()
.SELECT OBJECT_DELETE( {'state':'CA'}::OBJECT(state VARCHAR), 'state' ) AS new_object, SYSTEM$TYPEOF(new_object);
+------------+---------------------------+ | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) | |------------+---------------------------| | {} | OBJECT()[LOB] | +------------+---------------------------+
Lorsque le type d’une valeur OBJECT structurée comprend des paires clé-valeur, les noms et les types de ces paires sont inclus entre parenthèses dans le type (par exemple, OBJECT(ville VARCHAR)). Étant donné qu’une valeur OBJECT structurée vide ne contient aucune paire clé-valeur, les parenthèses sont vides.
Insertion de paires clé-valeur et mise à jour des valeurs¶
Pour renvoyer une nouvelle valeur OBJECT contenant les paires clé-valeur d’une valeur OBJECT existante avec des paires clé-valeur supplémentaires ou de nouvelles valeurs pour les clés, appelez la fonction OBJECT_INSERT.
Lors de l’appel de cette fonction, notez les points suivants :
Pour les arguments qui sont des clés, vous devez spécifier des constantes.
Lorsque l’argument
updateFlag
est défini sur FALSE (lorsque vous insérez une nouvelle paire clé-valeur) :Si vous spécifiez une clé qui existe déjà dans la valeur OBJECT, il se produit une erreur.
SELECT OBJECT_INSERT( {'city':'San Mateo','state':'CA'}::OBJECT(city VARCHAR,state VARCHAR), 'city', 'San Jose', false );
093202 (23001): Function OBJECT_INSERT: expected structured object to not contain field city but it did.
La fonction renvoie une valeur OBJECT structurée. Le type de la valeur OBJECT comprend la clé nouvellement insérée. Par exemple, supposons que vous ajoutiez la clé
zipcode
avec la valeur FLOAT94402
: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;
+-------------------------------------+---------------------------------------------------------------------------------------+ | 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 | | | } | | +-------------------------------------+---------------------------------------------------------------------------------------+
Le type de la valeur insérée détermine le type ajouté à la définition de type OBJECT. Dans ce cas, la valeur de
zipcode
est une valeur transformée en FLOAT, si bien que le type dezipcode
est FLOAT.
Lorsque l’argument
updateFlag
est défini sur TRUE (lorsque vous remplacez une paire clé-valeur existante) :Si vous spécifiez une clé qui n’existe pas dans la valeur OBJECT, il se produit une erreur.
La fonction renvoie une valeur OBJECT structurée du même type.
Le type de la valeur insérée est contraint à se transformer dans le type de la clé existante.
Sélection de paires clé-valeur à partir d’un OBJECT existant¶
Pour renvoyer une nouvelle valeur OBJECT contenant des paires clé-valeur sélectionnées à partir d’une valeur OBJECT existante, appelez la fonction OBJECT_PICK.
Lors de l’appel de cette fonction, notez les points suivants :
Pour les arguments qui sont des clés, vous devez spécifier des constantes.
Vous ne pouvez pas transmettre un ARRAY de clés comme deuxième argument. Vous devez spécifier chaque clé sous la forme d’un argument distinct.
La fonction renvoie une valeur OBJECT structurée. Le type de la valeur OBJECT comprend les clés dans l’ordre où elles sont spécifiées.
Supposons, par exemple, que vous sélectionniez les clés
state
etcity
dans cet ordre :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);
La fonction renvoie une valeur OBJECT du type
OBJECT(state VARCHAR, city VARCHAR)
.+-----------------------+--------------------------------------------------------------+ | NEW_OBJECT | SYSTEM$TYPEOF(NEW_OBJECT) | |-----------------------+--------------------------------------------------------------| | { | OBJECT(state VARCHAR(16777216), city VARCHAR(16777216))[LOB] | | "state": "CA", | | | "city": "San Mateo" | | | } | | +-----------------------+--------------------------------------------------------------+
Transformation de valeurs MAP¶
Pour transformer des valeurs MAP, utilisez les fonctions suivantes :
Utilisation de types structurés¶
Les sections suivantes expliquent comment utiliser différentes fonctions SQL et opérateurs d’ensemble avec des valeurs de types structurés :
Utilisation de la fonction FLATTEN avec des valeurs de types structurés
Utilisation de types structurés avec des opérateurs d’ensemble et des expressions CASE
Utilisation de la fonction FLATTEN avec des valeurs de types structurés¶
Vous pouvez transmettre des valeurs ARRAY structurées, des valeurs OBJECT structurées et des valeurs MAP à la fonction FLATTEN. Comme pour les types de données semi-structurées, vous pouvez utiliser l’argument PATH pour spécifier la valeur à aplatir.
Si la valeur à aplatir est une valeur ARRAY structurée et si l’argument RECURSIVE est défini sur FALSE, la colonne
value
contient une valeur du même type que la valeur ARRAY.Par exemple :
SELECT value, SYSTEM$TYPEOF(value) FROM TABLE(FLATTEN(INPUT => [1.08, 2.13, 3.14]::ARRAY(DOUBLE)));
+-------+----------------------+ | VALUE | SYSTEM$TYPEOF(VALUE) | |-------+----------------------| | 1.08 | FLOAT[DOUBLE] | | 2.13 | FLOAT[DOUBLE] | | 3.14 | FLOAT[DOUBLE] | +-------+----------------------+
Si la valeur aplatie est une valeur MAP et si l’argument RECURSIVE est défini sur FALSE, la colonne
key
contient une clé du même type que la clé de la MAP, et la colonnevalue
contient une valeur du même type que la valeur de la valeur MAP.Par exemple :
SELECT key, SYSTEM$TYPEOF(key), value, SYSTEM$TYPEOF(value) FROM TABLE(FLATTEN(INPUT => {'my_key': 'my_value'}::MAP(VARCHAR, VARCHAR)));
+--------+------------------------+----------+------------------------+ | KEY | SYSTEM$TYPEOF(KEY) | VALUE | SYSTEM$TYPEOF(VALUE) | |--------+------------------------+----------+------------------------| | my_key | VARCHAR(16777216)[LOB] | my_value | VARCHAR(16777216)[LOB] | +--------+------------------------+----------+------------------------+
Sinon, les colonnes
key
etvalue
sont de type VARIANT.
Pour les valeurs MAP, l’ordre des clés et des valeurs renvoyées est indéterminé.
Utilisation de la fonction PARSE_JSON¶
La fonction PARSE_JSON ne renvoie pas de types structurés.
Utilisation de types structurés avec des opérateurs d’ensemble et des expressions CASE¶
Vous pouvez utiliser des valeurs ARRAY structurées, des valeurs OBJECT structurées et des valeurs MAP dans les éléments suivants :
Pour les opérateurs d’ensemble, si différents types sont utilisés dans les différentes expressions (par exemple, si un type est ARRAY(NUMBER) et l’autre est ARRAY(DOUBLE)), un type est contraint de se transformer dans l’autre.
Utilisation d’autres fonctions semi-structurées¶
Les fonctions suivantes n’acceptent pas de valeurs ARRAY structurées, de valeurs OBJECT structurées ni de valeurs MAP comme argument d’entrée :
La transmission d’une valeur de type structuré en entrée entraîne une erreur.
Accès aux types structurés dans des applications utilisant des pilotes¶
Dans les applications qui utilisent des pilotes (par exemple le pilote ODBC ou JDBC, Snowflake Connector pour Python, etc.), les valeurs des types structurés sont renvoyées sous forme de valeurs de types semi-structurés. Par exemple :
Les valeurs d’une colonne ARRAY structurée sont renvoyées sous forme de valeurs ARRAY semi-structurées à l’application cliente.
Les valeurs d’une colonne OBJECT structurée ou d’une colonne MAP sont renvoyées sous forme de valeurs OBJECT semi-structurées à l’application cliente.
Note
Pour les applications client qui utilisent le pilote JDBC, la méthode ResultSet.getArray()
renvoie une erreur si les résultats de la requête que vous souhaitez récupérer contiennent une valeur ARRAY structurée avec des valeurs NULL.
Pour récupérer une représentation sous forme de chaîne à la place, utilisez la méthode ResultSet.getString()
:
String result = resultSet.getString(1);
Utilisation de types structurés avec des fonctions définies par l’utilisateur (UDFs) et des procédures stockées¶
Lorsque vous créez une fonction définie par l’utilisateur (UDF), une fonction de table définie par l’utilisateur (UDTF) ou une procédure stockée dans SQL, Exécution de scripts Snowflake, Java, Python ou Scala, vous pouvez utiliser des types structurés dans les arguments et les valeurs de retour. Par exemple :
CREATE OR REPLACE FUNCTION my_udf(
location OBJECT(city VARCHAR, zipcode NUMBER, val ARRAY(BOOLEAN)))
RETURNS VARCHAR
AS
$$
...
$$;
CREATE OR REPLACE FUNCTION my_udtf(check BOOLEAN)
RETURNS TABLE(col1 ARRAY(VARCHAR))
AS
$$
...
$$;
CREATE OR REPLACE PROCEDURE my_procedure(values ARRAY(INTEGER))
RETURNS ARRAY(INTEGER)
LANGUAGE SQL
AS
$$
...
$$;
CREATE OR REPLACE FUNCTION my_function(values ARRAY(INTEGER))
RETURNS ARRAY(INTEGER)
LANGUAGE PYTHON
RUNTIME_VERSION=3.10
AS
$$
...
$$;
Note
Les types structurés ne sont pas encore pris en charge dans les UDFs, dans les UDTFs ni dans les procédures stockées dans JavaScript.
Affichage d’informations sur les types structurés¶
Les sections suivantes décrivent les vues et les commandes que vous pouvez utiliser pour afficher des informations sur les types structurés :
Utilisation de la commande SHOW COLUMNS pour voir des informations sur les types structurés
Affichage d’informations sur les types structurés utilisés dans une base de données
Utilisation de la commande SHOW COLUMNS pour voir des informations sur les types structurés¶
Dans le résultat de la commande SHOW COLUMNS, la colonne data_type
contient des informations sur les types des éléments, des clés et des valeurs.
Utilisation des commandes DESCRIBE et autres SHOW pour voir des informations sur les types structurés¶
La sortie des commandes suivantes comprend des informations sur les types structurés :
Par exemple, dans la sortie DESCRIBE RESULT, la ligne d’une colonne MAP(VARCHAR, VARCHAR) contient la valeur suivante dans la colonne type
:
map(VARCHAR(16777216), VARCHAR(16777216))
La ligne d’une colonne ARRAY(NUMBER) contient la valeur suivante dans la colonne type
:
ARRAY(NUMBER(38,0))
Affichage d’informations sur les types structurés utilisés dans une base de données¶
Pour les colonnes de types structurés, le INFORMATION_SCHEMA Vue COLUMNS ne fournit que des informations sur le type de données de base de la colonne (ARRAY, OBJECT ou MAP).
Par exemple, la colonne data_type
contient simplement ARRAY
, OBJECT
ou MAP
. La colonne n’inclut pas les types des éléments, clés ou valeurs.
Pour obtenir des informations sur les types des éléments, clés et valeurs, utilisez les vues suivantes :
Pour obtenir des informations sur les types des éléments des types ARRAY structurés, interrogez la vue ELEMENT_TYPES dans INFORMATION_SCHEMA ou la vue ELEMENT_TYPES dans ACCOUNT_USAGE.
Pour obtenir des informations sur les types des clés et des valeurs des types OBJECT structurés et des types MAP, interrogez la vue FIELDS dans INFORMATION_SCHEMA ou la vue FIELDS dans ACCOUNT_USAGE.