Artículo
· 14 abr, 2025 Lectura de 3 min

¿Qué más podéis hacer con listas en SQL (%DLIST, %INLIST, FOR SOME)?

Lo que encuentro realmente útil de IRIS al enseñar mi asignatura de bases de datos post-relacionales es el hecho de que es una base de datos multimodelo. Lo que significa que podéis abordar la arquitectura y la estructura una sola vez y, después, mostrar el uso de diferentes modelos (como el objeto, documento, jerárquico) utilizando el mismo lenguaje y enfoque. Y no es un gran salto pasar de un lenguaje de programación orientado a objetos (como C#, Java, etc.) a una base de datos orientada a objetos.

Sin embargo, junto con las ventajas (que son muchas), vienen algunos inconvenientes cuando pasamos del modelo orientado a objetos al relacional. Cuando digo que podéis acceder a los mismos datos utilizando diferentes modelos, también necesito explicar cómo es posible trabajar con listas y arrays del modelo objeto en una tabla relacional. Con los arrays es muy sencillo: por defecto se representan como tablas separadas y eso es todo. Con las listas es más complicado, porque por defecto son cadenas de texto. Pero uno sigue queriendo hacer algo con ellas sin dañar la estructura ni volver esta lista ilegible en el modelo objeto.

Así que en este artículo os mostraré un par de predicados y una función que son útiles al trabajar con listas, y no solo como campos.

Supongamos que tenéis una clase `Restaurant.Dish`, la cual contendrá todos vuestros platos:

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;
}

Que de algún modo habéis rellenado con datos:

Y hay una clase `Restaurant.Account` que contiene los platos favoritos de los clientes:

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

Y también contiene datos:

Primero, veamos la función agregada %DLIST. Devuelve una estructura %List de ObjectScript que contiene los valores de la columna especificada como elementos de una lista. En general, la sintaxis es la siguiente:

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

Ahora, supongamos que necesitáis agrupar todos los platos por categorías y obtener una lista de todos los platos en esas categorías:

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

Otro es un predicado condicional %INLIST. Compara un valor con los elementos en una lista estructurada %List. Se asemeja al predicado IN, pero espera recibir un $LB como argumento, en lugar de valores separados por comas. Su sintaxis es la siguiente:

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

Por ejemplo, ahora queremos ver qué platos de los favoritos de nuestros clientes tenemos en el menú:

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

La última condición de predicado que quiero destacar es FOR SOME %ELEMENT. Esta condición coincide con los elementos de la lista del campo que cumplen con el predicado especificado. La palabra clave SOME especifica que al menos uno de los elementos del campo debe cumplir con la cláusula de predicado especificada. Esta cláusula debe contener la palabra clave %VALUE o %KEY, seguida de una condición de predicado. Estas palabras clave no distinguen entre mayúsculas y minúsculas. La sintaxis es la siguiente:

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

En cuanto al último ejemplo, supongamos que conseguimos una oferta para Sprite y Diet Coke y deseamos ver si tendrá aceptación entre nuestros clientes.

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

Así que esto es solo para atraer vuestra atención sobre estas 3 posibilidades de trabajar con listas en SQL. Para más detalles, por favor, visitad las páginas de documentación que referencié en el artículo. Y, por supuesto, siempre podéis utilizar las funciones integradas al trabajar con `$lb` en SQL.

Comentarios (0)1
Inicie sesión o regístrese para continuar