第六章 SQL聚合函数 JSON_ARRAYAGG

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第六章 SQL聚合函数 JSON_ARRAYAGG相关的知识,希望对你有一定的参考价值。

参考技术A

创建 JSON 格式值数组的聚合函数。

注:IRIS可用,IRIS之前版本不可用。

JSON_ARRAYAGG 聚合函数返回指定列中值的JSON格式数组。

一个简单的 JSON_ARRAYAGG (或 JSON_ARRAYAGG ALL )返回一个 JSON 数组,其中包含所选行中 string-expr 的所有值。
字符串 -expr 为空字符串 (") 的行由数组中的( " u0000" )表示。
字符串 -expr 为NULL的行不包含在数组中。
如果只有一个字符串 -expr 值,并且是空字符串( " ), JSON_ARRAYAGG 将返回 JSON 数组 ["\\u0000"] 。
如果所有的 string-expr 值为 NULL , JSON_ARRAYAGG 返回一个空的 JSON 数组 [] 。

JSON_ARRAYAGG DISTINCT 返回一个 JSON 数组,由所选行中 string-expr 的所有不同(唯一)值组成: JSON_ARRAYAGG(DISTINCT col1) 。
NULL 字符串 -expr 不包含在 JSON 数组中。
JSON_ARRAYAGG(DISTINCT BY(col2) col1) 返回一个 JSON 数组,该数组只包含记录中 col2 值是不同的(唯一的)的那些 col1 字段值。
但是请注意,不同的 col2 值可能包含一个单独的 NULL 值。

JSON_ARRAYAGG string-expr 不能是流字段。
指定流字段的结果是 SQLCODE -37 。

默认的 JSON_ARRAYAGG 返回类型是 VARCHAR(8192) 。
这个长度包括 JSON 数组格式化字符以及字段数据字符。
如果预期返回的值将需要大于 8192 ,可以使用 CAST 函数指定一个更大的返回值。
例如 CAST(JSON_ARRAYAGG(value)) AS VARCHAR(12000)) 。
如果实际返回的JSON数组长于 JSON_ARRAYAGG 返回类型长度,IRIS将在返回类型长度处截断JSON数组,而不会发出错误。
因为截断JSON数组会删除其关闭的 ] 字符,这使得返回值无效。

可以使用 %SelectMode 属性为 JSON 数组中的元素指定数据显示值: 0=Logical (默认值), 1=ODBC , 2= display 。
如果 string-expr 包含一个 %List 结构,则元素以ODBC模式表示,用逗号分隔,在逻辑和显示模式中以 %List 格式字符表示,用 \\ 转义序列表示。

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

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

注意,这个 JSON 数组包含重复的值。

下面的动态SQL示例返回一个主机变量,该变量包含样本的 Home_State 列中所有不同(唯一)值的JSON数组。
以字母 A 开头的人名表:

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

更有用的是一个 JSON 数组的所有不同的值,发现在 Home_City 列为每个州,如下所示的动态SQL示例:

注意,这个示例返回每个州的不同城市名称和总城市名称的整数计数。

下面的动态SQL示例使用 %SelectMode 属性为 DOB 日期字段返回的JSON值数组指定 ODBC 显示模式:

下面的动态SQL示例使用 %FOREACH 关键字。
它为每个不同的 Home_State 返回一行,其中包含该 Home_State 的年龄值的JSON数组。

下面的动态SQL示例使用 %AFTERHAVING 关键字。
它为每个 Home_State 返回一行,其中至少包含一个满足 HAVING 子句条件的 Name 值(以 “M” 开头的名称)。
第一个 JSON_ARRAYAGG 函数返回一个包含该状态所有名称的 JSON 数组。
第二个 JSON_ARRAYAGG 函数返回的 JSON 数组只包含满足 HAVING 子句条件的名称:

第六章 深入理解函数 Lua程序设计笔记

--第六章 深入理解函数
Lua中函数是“第一类值”,与其他传统类型有相同的权利:
可以储存到变量或table中,可以作为函数实参传递,还可以作为函数的返回值。

函数的标准定义:

foo = function(x) return x*2 end

一个函数定义实际上就是一条赋值语句,这条语句创建了一种类型为“函数”的值,并将这个值赋予一个变量。

 

 

--6.1closure(闭合函数)

function newCounter()
local i = 0
return function()
        i = i + 1
        return i
    end
end


非局部的变量(non-local variable):
是外部函数的局部变量,在内部的匿名函数中,既不是局部也不是全局变量。如上面的i。
一个closure就是一个函数加上该函数所需访问的所有“非局部的变量”。
c1和c2是同一个函数创建的两个不同的closure,它们各自拥有局部变量i的独立实例。

c1 = newCounter()
print(c1()) -->1
print(c1()) -->2
c2 = newCounter()
print(c2()) -->1
print(c1()) -->3
print(c2()) -->2

 

 

--6.2非全局函数
一个错误的示例:

local fact = function(n)
    if n == 0 then return 1
    else return n * fact(n-1)
    end
end

当编译到函数体中调用fact(n-1)时,由于局部fact尚未定义完毕,因此这个语句其实调用了一个全局的fact。

正确的写法:

local fact 
fact = function(n)
    if n == 0 then return 1
    else return n * fact(n-1)
    end
end

现在函数中的fact调用就表示局部变量。

 

使用语法糖

local function foo() <body> end

Lua将其展开为:

local foo
foo = function() <body> end

因此使用语法糖可以直接定义递归:

local function fact(n)
    if n == 0 then return 1
    else return n*fact(n-1)
    end
end

但是对于间接递归,必须使用明确的前向声明(forward declaration)

local f,g
function g()
    ... f() ...
end
function f()
    ... g() ...
end

 

 

--6.3正确的尾调用(tail call)
当一个函数调用的是另一个函数的最后动作是,才是一条尾调用:

function f(x) return g(x) end

不是尾调用的示例:

function f(x) g(x) end --调用完g后,f并不能立即返回,而还需要丢弃g返回的临时结果
return g(x) + 1   --还要做一个加法
return x or g(x)  --还要调整为一个返回值
return (g(x))     --还要调整为一个返回值

一个尾调用就好比一个goto语句,迷宫游戏的案例:

function room1()
    local move = io.read()
    if move == "south" then return room3() 
    elseif move == "east" then return room2()
    else print("invalid move") return room1()
    end
end
function room2()
    local move = io.read()
    if move == "south" then return room4() 
    elseif move == "west" then return room1()
    else print("invalid move") return room2()
    end
end
function room3()
    local move = io.read()
    if move == "north" then return room1() 
    elseif move == "east" then return room4()
    else print("invalid move") return room3()
    end
end
function room4()
    print("congratulations!")
end

通过调用room1()进入游戏

以上是关于第六章 SQL聚合函数 JSON_ARRAYAGG的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据操作与查询(第六章 上)

MySQL数据操作与查询(第六章 下)

第六章 Realm及相关对象 AuthorizationInfo

java 第六章 面向对象基础

第六章API服务网关(Zuul) 下

第六章函数和宏定义