SQL聚合函数 %DLIST

2022-03-27 12:50:52 浏览数 (1)

SQL聚合函数 %DLIST

创建值列表的聚合函数。

大纲

代码语言:javascript复制
%DLIST([ALL | DISTINCT [BY(col-list)]] string-expr [%FOREACH(col-list)] [�TERHAVING])

参数

  • ALL - 可选-指定%DLIST返回string-expr的所有值的列表。如果未指定关键字,则这是默认值。
  • DISTINCT - 可选- DISTINCT子句,指定%DLIST返回一个结构化的%List,其中只包含唯一的string-expr值。 DISTINCT可以指定BY(colo -list)子句,其中colo -list可以是单个字段,也可以是用逗号分隔的字段列表。
  • string-expr - 计算结果为字符串的SQL表达式。 通常是所选表中列的名称。
  • %FOREACH(col-list) - 可选-列名或以逗号分隔的列名列表。
  • �TERHAVING - 可选-应用在HAVING子句中的条件。

描述

%DLIST聚合函数返回一个ObjectScript %List结构,其中包含指定列中的值作为列表元素。

一个简单的%DLIST(或%DLIST ALL)返回列表,该列表由所选行中string-expr的所有非null值组成。 string-exprNULL的行不会作为元素包含在列表结构中。

%DLIST DISTINCT返回一个列表,由所选行中string-expr的所有不同(唯一)非null值组成:%DLIST(DISTINCT col1)NULL不作为元素包含在%List结构中。 %DLIST(DISTINCT BY(col2) col1)返回一个元素的%List,其中只包含那些col1字段值在col2值不同(唯一)的记录中。 但是请注意,不同的col2值可能包含一个单独的NULL值。

%DLIST 和 %SelectMode

可以使用%SelectMode属性来指定%DLIST返回的数据显示模式:0=Logical(默认)1=ODBC, 2= display

请注意,在ODBC模式下,%DLIST用逗号分隔列值列表,而$LISTTOSTRING(默认情况下)返回%List列值中用逗号分隔的元素。

%DLIST和ORDER BY

%DLIST函数将表中多行列的值组合成%List结构的值列表。 因为在计算所有聚合字段之后,查询结果集中应用了一个ORDER BY子句,所以ORDER BY不能直接影响这个列表中的值序列。 在某些情况下,%DLIST结果可能会按顺序出现,但不应依赖此顺序。 在给定聚合结果值中列出的值不能显式排序。

相关的聚合函数

  • %DLIST返回一个IRIS列表的值。
  • LIST返回一个逗号分隔的值列表。
  • JSON_ARRAYAGG返回值的JSON数组。
  • XMLAGG返回一个串接的值字符串。

示例

下面的嵌入式SQL示例返回一个主机变量,该变量包含示例的Home_State列中列出的所有值的IRIS列表。 以字母A开头的人名表:

代码语言:javascript复制
ClassMethod DList()
{
    &sql(
        SELECT %DLIST(Home_State)
            INTO :statelist
            FROM Sample.Person
            WHERE Home_State %STARTSWITH 'A')
    w "The states (as list):",statelist,!
    w "The states (as string):",$LISTTOSTRING(statelist,"^")
}
代码语言:javascript复制
DHC-APP>d ##class(PHA.TEST.SQLCommand).DList()
The states (as list):�AR�AL�AZ�AZ�AZ�AR�AL�AZ�AR�AL�AL�AR
The states (as string):AR^AL^AZ^AZ^AZ^AR^AL^AZ^AR^AL^AL^AR

请注意,这个IRIS列表包含具有重复值的元素。

下面的嵌入式SQL示例返回一个主机变量,该变量包含示例的Home_State列中列出的所有不同(唯一)值的IRIS列表。 以字母A开头的人名表:

代码语言:javascript复制
ClassMethod DList1()
{
    &sql(
        SELECT %DLIST(DISTINCT Home_State)
            INTO :statelist
            FROM Sample.Person
            WHERE Home_State %STARTSWITH 'A')
    w "The states (as list):",statelist,!
    w "The states (as string):",$LISTTOSTRING(statelist,"^")
}
代码语言:javascript复制
DHC-APP>d ##class(PHA.TEST.SQLCommand).DList1()
The states (as list):�AR�AL�AZ
The states (as string):AR^AL^AZ

下面的SQL示例为每个州创建了一个 IRIS列表,其中包含在Home_City列中找到的所有值,以及按州列出的这些城市值的计数。 每个Home_State行包含该状态的所有Home_City值的列表。 这些名单可能包括重复的城市名称:

代码语言:javascript复制
SELECT Home_State,
       %DLIST(Home_City) AS AllCities,
       COUNT(Home_City) AS CityCount
FROM Sample.Person
GROUP BY Home_State

0 人点赞