Passer au contenu principal
Une structure de données imbriquée s’apparente à une table à l’intérieur d’une cellule. Les paramètres d’une structure de données imbriquée — les noms et les types des colonnes — sont spécifiés de la même manière que dans une requête CREATE TABLE. Chaque ligne de table peut correspondre à un nombre quelconque de lignes dans une structure de données imbriquée.
Évitez d’utiliser des points dans les noms de colonnesLes noms de colonnes contenant des points, les colonnes partageant un préfixe commun se terminant par un point, ainsi que les colonnes de type Array, peuvent chacun être interprétés comme faisant partie d’une structure Nested aplatie lorsque flatten_nested = 1 (valeur par défaut). Cela peut entraîner une validation inattendue de la longueur des tableaux lors des insertions, ainsi que des restrictions de renommage.Évitez, si possible, d’utiliser des points dans les noms de colonnes. Utilisez des traits de soulignement (_) ou un autre séparateur à la place des points dans les noms de colonnes, sauf si vous avez volontairement besoin de la sémantique Nested.
Exemple :
L’instruction DDL 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 :
Il est plus simple de considérer une structure de données imbriquée comme un ensemble de plusieurs tableaux de colonnes de même longueur.

Filtrage des colonnes Nested dans WHERE

Comme chaque colonne d’une structure 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 :
Utilisez has pour vérifier si un tableau contient une valeur donnée :
Utilisez arrayExists si la condition est plus complexe :
Vous pouvez filtrer selon la longueur des tableaux avec length ou exclure les tableaux vides avec notEmpty :
Pour filtrer des éléments individuels d’une structure imbriquée plutôt que des lignes entières, utilisez 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 :
Vous ne pouvez pas exécuter 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

Pour une requête 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 :
Tous les tableaux de sous-colonnes imbriquées au sein d’une même ligne doivent avoir la même longueur. Des longueurs différentes provoquent une erreur :
Pour une requête 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

Les requêtes 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 :
La suppression des sous-colonnes fonctionne pour chaque sous-colonne individuellement :
La modification du type d’une sous-colonne fonctionne et déclenche une mutation (réécriture des données) :
Le renommage est soumis à certaines restrictions. Vous pouvez renommer une sous-colonne au sein de la même structure imbriquée :
Cependant, vous ne pouvez pas :
  • Renommer la structure imbriquée entière (par exemple, Goals en Conversions).
  • Déplacer une sous-colonne vers une autre structure imbriquée (par exemple, Goals.ID vers OtherNested.ID).
  • Déplacer une sous-colonne hors d’une structure imbriquée ou l’y déplacer (par exemple, Goals.ID vers GoalID, ou inversement).
Dernière modification le 2 juillet 2026