“Je vois écrit STRUCT en dans le code SQL et je cela ne me paraît pas clair ce que ça fait dans ma table 🤔”
Pour ma part, j’ai surtout rencontrer cette fonctionnalité avec mon utilisation de BigQuery.
Pour tenter de faire simple, STRUCT permet de réunir des données d’un même périmètre, comme une adresse avec un numéro, une rue, un code postal, etc., au sein de même champ.
Dis d’une autre manière, ce sont plusieurs champs qui sont regroupés dans un champ.
Voici la syntaxe pour créer un STRUCT :
STRUCT(
valeur AS nomChamp1
,valeur AS nomChamp2
,...
) AS nomStruct
Voici un exemple plus concret :
WITH cte_customerData AS (
SELECT
1 AS customerId,
'Dupont' AS lastName,
'Jean' AS firstName,
STRUCT(
'10 Rue de Rivoli' AS addressLine1,
CAST(NULL AS STRING) AS addressLine2,
'Paris' AS city,
'75001' AS postalCode,
'France' AS country
) AS address
UNION ALL
SELECT
2 AS customerId,
'Martin' AS lastName,
'Sophie' AS firstName,
STRUCT(
'25 Avenue des Champs-Élysées' AS addressLine1,
'Bâtiment B' AS addressLine2,
'Paris' AS city,
'75008' AS postalCode,
'France' AS country
) AS address
)
SELECT
customerId,
address
FROM cte_customerData;
Lorsque que je fais un export, le format d’un STRUCT est plutôt celui d’un JSON :
customerId address
1 "{
""address"": {
""addressLine1"": ""10 Rue de Rivoli"",
""addressLine2"": null,
""city"": ""Paris"",
""postalCode"": ""75001"",
""country"": ""France""
}
}"
2 "{
""address"": {
""addressLine1"": ""25 Avenue des Champs-Élysées"",
""addressLine2"": ""Bâtiment B"",
""city"": ""Paris"",
""postalCode"": ""75008"",
""country"": ""France""
}
}"
Néanmoins, je vous montre comment il est visible dans l’interface BigQuery (partie RESULTATS) :
Ligne | customerId | address.addressLine1 | address.addressLine2 | address.city | address.postalCode | address.country |
1 | 1 | 10 Rue de Rivoli | null | Paris | 75001 | France |
2 | 2 | 25 Avenue des Champs-Élysées | Bâtiment B | Paris | 75008 | France |
On visualise donc le STRUCT avec son nom.leNomDuChampDedans.
Cette visualisation représente bien comment nous pouvons accéder directement à un champ à l’intérieur d’un STRUCT sans devoir tout afficher :
WITH cte_customerData AS (
SELECT
1 AS customerId,
'Dupont' AS lastName,
'Jean' AS firstName,
STRUCT(
'10 Rue de Rivoli' AS addressLine1,
CAST(NULL AS STRING) AS addressLine2,
'Paris' AS city,
'75001' AS postalCode,
'France' AS country
) AS address
UNION ALL
SELECT
2 AS customerId,
'Martin' AS lastName,
'Sophie' AS firstName,
STRUCT(
'25 Avenue des Champs-Élysées' AS addressLine1,
'Bâtiment B' AS addressLine2,
'Paris' AS city,
'75008' AS postalCode,
'France' AS country
) AS address
)
SELECT
customerId,
address.city,
address.country
FROM cte_customerData;
Le résultat :
Ligne | customerId | city | country |
1 | 1 | Paris | France |
2 | 2 | Paris | France |
En accédant directement à un champ dans le STRUCT c’est bien un nouveau champ de format plus “classique” qui est renvoyé et qui peut être manipulé comme n’importe quel autre champ.
Je vous parlerai bientôt des ARRAY() et son utilisation avec les STRUCT pour ouvrir totalement le champ des possibilités !
Merci de votre lecture !