Dans ClickHouse, les opérations sur les tableaux telles que l'intersection, l'union et la différence peuvent être effectuées à l'aide de fonctions intégrées et de clauses SQL spécifiques.
Intersection de tableaux
La fonction arrayIntersect(arr1, arr2, ...) retourne un sous-tableau contenant les éléments communs aux tableaux d'entrée. Exemple :
SELECT
arrayIntersect([10, 20, 30], [40, 50, 60]) AS aucune_intersection,
arrayIntersect([10, 20, 30], [20, 30, 40, 50, 60]) AS intersection_existe
FORMAT Vertical
Résultat : aucune_intersection: [] ; intersection_existe: [30,20]
Union de tableaux
L'union de tableaux est réalisée en combinant arrayDistinct et arrayConcat pour éliminer les doublons. Exemple :
SELECT
[10, 20] AS tableau_un,
[20, 30] AS tableau_deux,
arrayDistinct(arrayConcat(tableau_un, tableau_deux)) AS resultat_union
FORMAT Vertical
Résultat : tableau_un: [10,20] tableau_deux: [20,30] resultat_union: [10,20,30]
Différence de tableaux
La différence n'a pas de fonction dédiée, mais peut être implémentée en utilisant arrayIntersect avec les fonctions d'ordre supérieur arrayMap et arrayFilter. Exemple :
SELECT
[10, 20] AS source_tableau,
[20, 30] AS tableau_exclu,
arrayFilter(x -> (x IS NOT NULL), arrayMap(x -> multiIf(x NOT IN arrayIntersect(source_tableau, tableau_exclu), x, NULL), source_tableau)) AS difference_resultat
FORMAT Vertical
Résultat : source_tableau: [10,20] tableau_exclu: [20,30] difference_resultat: [10]
Utilisation des clauses SQL pour les opérations ensemblistes
ClickHouse supporte les clauses SQL INTERSECT, UNION et EXCEPT pour les opérations sur les ensembles dérivés de tableuax.
Intersection avec INTERSECT :
SELECT a.item
FROM
(
SELECT arrayJoin([10, 20]) AS item
) AS a
INTERSECT
SELECT b.item
FROM
(
SELECT arrayJoin([20, 30]) AS item
) AS b
Résultat : 20
Union avec UNION et DISTINCT :
SET union_default_mode = 'ALL';
SELECT DISTINCT t.item
FROM
(
SELECT a.item
FROM
(
SELECT arrayJoin([10, 20]) AS item
) AS a
UNION
SELECT b.item
FROM
(
SELECT arrayJoin([20, 30]) AS item
) AS b
) AS t
Résultat : 10 20 30
Différence avec EXCEPT :
SELECT a.item
FROM
(
SELECT arrayJoin([10, 20]) AS item
) AS a
EXCEPT
SELECT b.item
FROM
(
SELECT arrayJoin([20, 30]) AS item
) AS b
Résultat : 10
Les fonctions clés utilisées incluent arrayIntersect pour les intersections, arrayConcat pour la concaténation, arrayDistinct pour la déduplication, arrayMap pour la transformation par lambda et arrayFilter pour le filtrage par lambda.