| --- |
| { |
| "title": "STRUCT_ELEMENT", |
| "language": "en", |
| "description": "Returns a specific field within a struct data column. The function supports accessing fields in a struct through field position (index) or field name." |
| } |
| --- |
| |
| :::caution |
| As no other database or query engine provides such a function, `STRUCT_ELEMENT` has been removed since version 4.1.3. Please use the [`ELEMENT_AT`](../variant-functions/element-at.md) function instead (or the equivalent subscript `s[k]` / `s['field_name']` and dot `s.field_name` syntax). |
| ::: |
| |
| ## Description |
| |
| Returns a specific field within a struct data column. The function supports accessing fields in a struct through field position (index) or field name. |
| |
| ## Syntax |
| |
| ```sql |
| STRUCT_ELEMENT( <struct>, <field_location_or_name> ) |
| ``` |
| |
| ## Parameters |
| |
| - `<struct>`: Input struct column |
| - `<field_location_or_name>`: Field position (starting from 1) or field name, only supports constants |
| |
| ## Return Value |
| |
| Return type: Field value type supported by struct |
| |
| Return value meaning: |
| - Returns the specified field value |
| - If the input struct is null, returns null |
| - If the specified field does not exist, an error will be reported |
| |
| ## Usage |
| |
| - Supports accessing by field position (index), index starts from 1 |
| - Supports accessing by field name; the field name is matched **case-insensitively** |
| - The second parameter must be a constant (cannot be a column) |
| - The function is marked as AlwaysNullable, return value may be null |
| - Since version 4.1.3, `STRUCT_ELEMENT` is removed. Use `ELEMENT_AT(<struct>, ...)`, the subscript operators `<struct>[<index>]` / `<struct>['<field_name>']`, or the dot operator `<struct_col>.<field_name>` instead — these are all equivalent ways to access a struct field. |
| |
| ## Examples |
| |
| **Query Examples:** |
| |
| Access by position: |
| ```sql |
| select struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 1); |
| +--------------------------------------------------------------------------------+ |
| | struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 1) | |
| +--------------------------------------------------------------------------------+ |
| | Alice | |
| +--------------------------------------------------------------------------------+ |
| ``` |
| |
| Access by field name: |
| ```sql |
| select struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 'age'); |
| +------------------------------------------------------------------------------------+ |
| | struct_element(named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing'), 'age') | |
| +------------------------------------------------------------------------------------+ |
| | 25 | |
| +------------------------------------------------------------------------------------+ |
| ``` |
| |
| Access using the subscript operator (equivalent to the calls above): |
| ```sql |
| select named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing')[1] as by_index, |
| named_struct('name', 'Alice', 'age', 25, 'city', 'Beijing')['age'] as by_name; |
| +----------+---------+ |
| | by_index | by_name | |
| +----------+---------+ |
| | Alice | 25 | |
| +----------+---------+ |
| ``` |
| |
| Accessing struct containing complex types: |
| ```sql |
| select struct_element(named_struct('array', [1,2,3], 'map', {'key':'value'}), 'array'); |
| +---------------------------------------------------------------------------------+ |
| | struct_element(named_struct('array', [1,2,3], 'map', {'key':'value'}), 'array') | |
| +---------------------------------------------------------------------------------+ |
| | [1, 2, 3] | |
| +---------------------------------------------------------------------------------+ |
| ``` |
| |
| Accessing result with null field value: |
| ```sql |
| select struct_element(named_struct('name', null, 'age', 25), 'name'); |
| +---------------------------------------------------------------+ |
| | struct_element(named_struct('name', null, 'age', 25), 'name') | |
| +---------------------------------------------------------------+ |
| | NULL | |
| +---------------------------------------------------------------+ |
| ``` |
| |
| Error Examples |
| |
| Accessing non-existent field name: |
| ```sql |
| select struct_element(named_struct('name', 'Alice', 'age', 25), 'nonexistent'); |
| ERROR 1105 (HY000): errCode = 2, detailMessage = the specified field name nonexistent was not found: struct_element(named_struct('name', 'Alice', 'age', 25), 'nonexistent') |
| ``` |
| |
| Accessing out-of-bounds index: |
| ```sql |
| select struct_element(named_struct('name', 'Alice', 'age', 25), 5); |
| ERROR 1105 (HY000): errCode = 2, detailMessage = the specified field index out of bound: struct_element(named_struct('name', 'Alice', 'age', 25), 5) |
| ``` |
| |
| Second parameter is not a constant: |
| ```sql |
| select struct_element(named_struct('name', 'Alice', 'age', 25), inv) from var_with_index where k = 4; |
| ERROR 1105 (HY000): errCode = 2, detailMessage = element_at over a struct only allows a constant int or string second parameter: element_at(named_struct('name', 'Alice', 'age', 25), inv) |
| ``` |
| |
| Input struct is NULL, will report error: |
| ```sql |
| select struct_element(NULL, 5); |
| ERROR 1105 (HY000): errCode = 2, detailMessage = Can not find the compatibility function signature: struct_element(NULL, TINYINT) |
| ``` |