Article
· Mars 25 4m de lecture

Que peut-on faire avec les listes en SQL (%DLIST, %INLIST, FOR SOME)

Ce que je trouve vraiment utile à propos d'IRIS lorsque j'enseigne mon sujet des bases de données postrelationnelles, c'est le fait qu'il s'agit d'une base de données multi-modèles. Ce qui signifie que je peux aborder l'architecture et la structure et tout cela une seule fois, mais ensuite montrer l'utilisation de différents modèles (comme l'objet, le document, la hiérarchie) en utilisant le même langage et la même approche. Et ce n'est pas un grand pas de passer d'un langage de programmation orienté objet (comme C#, Java, etc.) à une base de données orientée objet.

Cependant, aux avantages (qui sont nombreux) s'ajoutent certains inconvénients quand on passe du modèle orienté objet au modèle relationnel. Lorsque je dis que vous pouvez accéder aux mêmes données en utilisant différents modèles, je dois également expliquer comment il est possible de travailler avec des listes et des arrays à partir d'un modèle objet dans une table relationnelle. Avec les arrays, c'est très simple : par défaut, ils sont représentés sous forme de tableaux séparés et c'est tout. Avec les listes, c'est plus difficile car par défaut c'est une $lb. Mais on veut quand même faire quelque chose sans endommager la structure et sans rendre cette liste illisible dans le modèle objet.

Ainsi, dans cet article, je présenterai quelques prédicats et une fonction qui sont utiles lorsque vous travaillez avec des listes, et pas seulement en tant que champs.

Disons que nous avons une classe Restaurant.Plat qui contiendra tous nos plats :

Class Restaurant.Dish Extends %Persistent
{
Property Name As %String;
Property Description As %String(MAXLEN = 1000);
Property Category As %String;
Property Price As %Float;
Property Currency As %String;
Property Calories As %Integer;
}

Avec des données :

Et il y a une classe Restaurant.Accunt qui contient les plats préférés des clients :

Class Restaurant.Account Extends %Persistent
{
Property Name As %Name;
Property FavouriteFood As list Of %String;
}

Et il contient également des données :

Tout d'abord, regardons la fonction d'agrégation %DLIST. Il renvoie une structure ObjectScript %List contenant les valeurs de la colonne spécifiée en tant qu'éléments de liste. En général, la syntaxe est la suivante :

%DLIST([ALL | DISTINCT [BY(col-list)]] 
  string-expr 
  [%FOREACH(col-list)] [%AFTERHAVING])

Maintenant, disons que nous devons regrouper tous les plats par catégories et obtenir une liste de tous les plats dans ces catégories :

select Category,
       %DLIST(Name) AS AllDishes,
       %DLIST(Distinct (Name)) AS AllDistinctDishes
  from Restaurant.Dish
GROUP BY Category
ORDER BY Category

Un autre prédicat %INLIST. Il fait correspondre une valeur aux éléments d'une liste structurée %List. Il ressemble au prédicat IN mais s'attend à obtenir un $LB comme argument, au lieu de valeurs séparées par des virgules. Sa syntaxe est la suivante :

scalar-expression %INLIST list [SIZE ((nn))]

Par exemple, nous voulons maintenant voir quels plats parmi les favoris de nos clients nous avons sur un menu :

select Name, Description, Price
  from Restaurant.Dish
WHERE name %INLIST (select FavouriteFood 
                      from Restaurant.Account 
                     where ID = 1)  SIZE ((10))

Et le dernier prédicat que je souhaite souligner ici est FOR SOME %ELEMENT. Il fait correspondre les éléments de la liste dans le champ avec le prédicat spécifié. Le mot clé SOME spécifie qu'au moins un des éléments du champ doit satisfaire à la clause de prédicat spécifiée. La clause de prédicat doit contenir le mot clé %VALUE ou %KEY, suivi d'une condition de prédicat. Ces mots-clés ne sont pas sensibles à la casse. La syntaxe est la suivante :

FOR SOME %ELEMENT(field) [[AS] e-alias] (predicate)

Quant au dernier exemple, disons que nous avons conclu un accord pour Sprite et Diet Coke et que nous souhaitons voir s'il aura du succès auprès de nos clients.

select *
  from Restaurant.Account 
 where FOR SOME %ELEMENT(FavouriteFood) f
     (f.%VALUE IN ('Sprite','Diet Coke') and %KEY IS NOT NULL)

C'est donc juste pour attirer votre attention sur ces 3 possibilités de travailler avec des listes en SQL. Pour plus de détails, veuillez visiter les pages de documentation auxquelles j'ai fait référence dans l'article. Et bien sûr, vous pouvez toujours utiliser les fonctions intégrées lorsque vous travaillez avec $lb en SQL.

Discussion (0)1
Connectez-vous ou inscrivez-vous pour continuer