SQL - Comment regrouper ses données avec STRUCT ?

SQL - Comment regrouper ses données avec STRUCT ?

Date de sortie
August 6, 2024
Auteur
Bertrand Fabre
“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 !