Saltar al contenido principal
Una estructura de datos anidada es como una tabla dentro de una celda. Los parámetros de una estructura de datos anidada —los nombres y tipos de las columnas— se especifican igual que en una consulta CREATE TABLE. Cada fila de la tabla puede corresponder a cualquier cantidad de filas en una estructura de datos anidada.
Evite usar puntos en los nombres de las columnasLos nombres de columna que contienen puntos, las columnas que comparten un prefijo común separado por punto y las columnas con el tipo Array pueden interpretarse como parte de una estructura Nested aplanada cuando flatten_nested = 1 (valor predeterminado). Esto puede provocar una validación inesperada de la longitud de los arrays en las operaciones de inserción y restricciones al cambiar el nombre.Evite usar puntos en los nombres de las columnas siempre que sea posible. Use guiones bajos (_) u otro separador en lugar de puntos en los nombres de las columnas, a menos que necesite intencionadamente la semántica de Nested.
Ejemplo:
La sentencia DDL CREATE TABLE anterior declara la estructura de datos anidada Goals, que contiene datos sobre conversiones, u objetivos alcanzados. Cada fila de la tabla ‘visits’ corresponde a cero o más conversiones. Cuando la configuración flatten_nested se establece en 0 (flatten_nested=1 de forma predeterminada), se admiten niveles arbitrarios de anidamiento. En la mayoría de los casos, al trabajar con una estructura de datos anidada, sus columnas se especifican mediante nombres de columna separados por un punto. Estas columnas forman un array de tipos correspondientes. Todos los arrays de columnas de una misma estructura de datos anidada tienen la misma longitud. Por ejemplo:
La forma más sencilla de entender una estructura de datos anidada es como un conjunto de varios arrays de columnas de igual longitud.

Filtrado de columnas Nested en WHERE

Como cada columna de una estructura Nested se almacena como un Array, al referenciarla en una cláusula WHERE obtienes el array completo de cada fila, no un elemento individual. No puedes comparar directamente una columna anidada con un valor escalar, así que debes usar funciones de arrays. Por ejemplo, esta consulta no devuelve silenciosamente cero filas, sino que genera una excepción, porque Goals.ID es de tipo Array(UInt32) y equals(Array(UInt32), UInt32) no es una comparación válida:
Usa has para comprobar si un array contiene un valor específico:
Usa arrayExists cuando la condición sea más compleja:
Puede filtrar por la longitud de un array con length o excluir los arrays vacíos con notEmpty:
Para filtrar elementos individuales de una estructura anidada en lugar de filas completas, use ARRAY JOIN para expandir primero los arrays. Después de ARRAY JOIN, cada elemento se convierte en una fila independiente, por lo que la cláusula WHERE se aplica a valores escalares. Para obtener más información, consulte la cláusula ARRAY JOIN. Ejemplo:
No se puede realizar SELECT sobre una estructura de datos anidada completa. Solo se pueden enumerar explícitamente las columnas individuales que forman parte de ella.

Inserción de datos

Para una consulta INSERT, debe pasar por separado todos los arrays de las columnas que componen una estructura de datos anidada (como si fueran arrays de columnas individuales). Durante la inserción, el sistema comprueba que todos tengan la misma longitud. Cada subcolumna anidada aparece en la lista de columnas con notación de punto (Goals.ID, Goals.Serial, …), y los valores correspondientes son arrays:
Todos los arrays de subcolumnas anidadas dentro de una misma fila deben tener la misma longitud. Si las longitudes no coinciden, se produce un error:
En una consulta DESCRIBE, las columnas de una estructura de datos anidada también se muestran por separado, de la misma manera.

Limitaciones de ALTER

Las consultas ALTER sobre estructuras de datos anidadas tienen las siguientes limitaciones: Añadir subcolumnas funciona con normalidad. Puede añadir una nueva subcolumna a una estructura Nested existente:
La eliminación de subcolumnas se aplica a subcolumnas individuales:
Modificar el tipo de una subcolumna es posible y desencadena una mutación (reescritura de datos):
Cambiar el nombre tiene restricciones. Puede cambiar el nombre de una subcolumna dentro de la misma estructura anidada:
Sin embargo, no puedes:
  • Cambiar el nombre de la estructura anidada completa (p. ej., Goals por Conversions).
  • Mover una subcolumna a otra estructura anidada (p. ej., Goals.ID a OtherNested.ID).
  • Sacar una subcolumna de una estructura anidada o moverla a una (p. ej., Goals.ID a GoalID o viceversa).
Última modificación el 2 de julio de 2026