第六章 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的主要内容,如果未能解决你的问题,请参考以下文章