CREATE TABLE ci-dessus déclare la structure de données imbriquée Goals, qui contient des données sur les conversions, c’est-à-dire les objectifs atteints.
Chaque ligne de la table ‘visits’ correspond à zéro conversion ou plus.
Lorsque le paramètre flatten_nested est défini sur 0 (flatten_nested=1 par défaut), des niveaux d’imbrication arbitraires sont pris en charge.
Dans la plupart des cas, lorsque vous travaillez avec une structure de données imbriquée, ses colonnes sont désignées par des noms de colonne séparés par un point.
Ces colonnes forment un tableau de types correspondants.
Tous les tableaux de colonnes d’une même structure de données imbriquée ont la même longueur.
Par exemple :
Filtrage des colonnes Nested dans WHERE
Nested est stockée sous forme d’Array, le fait d’y faire référence dans une clause WHERE renvoie l’intégralité du tableau pour chaque ligne, et non un élément individuel. Vous ne pouvez pas comparer directement une colonne Nested à une valeur scalaire ; vous devez donc utiliser des array functions.
Par exemple, cette requête ne se contente pas de ne renvoyer aucune ligne de façon silencieuse : elle déclenche une exception, car Goals.ID a pour type Array(UInt32) et equals(Array(UInt32), UInt32) n’est pas une comparaison valide :
has pour vérifier si un tableau contient une valeur donnée :
arrayExists si la condition est plus complexe :
length ou exclure les tableaux vides avec notEmpty :
ARRAY JOIN pour déployer d’abord les tableaux.
Après ARRAY JOIN, chaque élément devient une ligne distincte ; la clause WHERE s’applique donc à des valeurs scalaires.
Pour plus d’informations, consultez la clause ARRAY JOIN. Exemple :
SELECT sur l’ensemble d’une structure de données imbriquée. Vous pouvez seulement énumérer explicitement les colonnes individuelles qui la composent.
Insertion de données
INSERT, vous devez transmettre séparément tous les tableaux des colonnes composantes d’une structure de données imbriquée (comme s’il s’agissait de tableaux de colonnes distincts). Lors de l’insertion, le système vérifie qu’ils ont tous la même longueur.
Chaque sous-colonne imbriquée est indiquée dans la liste des colonnes à l’aide de la notation par points (Goals.ID, Goals.Serial, …), et les valeurs correspondantes sont des tableaux :
DESCRIBE, les colonnes d’une structure de données imbriquée sont répertoriées séparément de la même façon.
Limites d’ALTER
ALTER sur les structures de données imbriquées présentent les limites suivantes :
L’ajout de sous-colonnes fonctionne normalement. Vous pouvez ajouter une nouvelle sous-colonne à une structure Nested existante :
- Renommer la structure imbriquée entière (par exemple,
GoalsenConversions). - Déplacer une sous-colonne vers une autre structure imbriquée (par exemple,
Goals.IDversOtherNested.ID). - Déplacer une sous-colonne hors d’une structure imbriquée ou l’y déplacer (par exemple,
Goals.IDversGoalID, ou inversement).