PQL 快速入门
PQL基础
数据流转
输出文件
PQL 中的语句
分支和循环
更优雅的数据操作
PQL 高级特性
系统函数
自定义函数
扩展操作
其他语言相关
附录
数据表是一种比较特殊的集合类型,概念上是一个二维表格。数据表与关系型数据库的数据表概念一致,也包含列、字段、行等。数据表的某一行的数据类型是“数据行”,数据表某一列的数据列表是“数组”,数据表某一个单元格的数据类型按照数据表对应列的数据类型确定。注意:下面涉及 Json 对象中的字符串一定要用双引号。
FIRST ROW
返回表格的第一行,表格为空时抛出异常。FIRST ROW row
返回表格的第一行,如果表格为空则返回数据行row
,row
用 Json 对象表示。
LAST ROW
返回表格的最后一行,表格为空时抛出异常。LAST ROW row
返回表格的最后一行,如果表格为空则返回数据行row
,row
用 Json 对象表示,同FIRST ROW
。ROW n
得到第 n 行,索引从1
开始,如果不存在则抛出异常。FIRST COLUMN
得到第一列的所有值,返回数组。如果数据表为空,则抛出异常。FIRST COLUMN array
得到表格的第一列的所有值,返回数组。如果数据表为空则返回数组array
,array
用 Json 数组表示。
LAST COLUMN
得到表格的最后一列的所有值,返回数组。如果不存在则抛出异常。LAST COLUMN array
得到表格的最后一列的所有值,返回数组。如果数据表为空则返回数组array
,array
用 Json 数组表示,同FIRST COLUMN
。COLUMN 'column'
根据字段名column
返回此列的所有值,不存在则抛出异常。FIRST CELL
返回第一行第一列的值,数据类型根据第一列的数据类型确定,经常用于返回单值。数据表为空时抛出异常。LAST CELL
返回最后一行最后一列的值,数据类型根据最后一列的数据类型确定。数据表为空时抛出异常。FIRST ROW CELL 'column'
返回第一行列名为column
列的值。不存在时则抛出异常。LAST ROW CELL 'column'
返回最后一行列名为column
列的值。不存在时则抛出异常。HAS 'column'
判断数据表中是否包含名称为column
的列。RANDOM n
从数据表随机取n
个数据行,结果类型仍是数据表,n
大于等于1
且n
小于等于数据表的记录数,n
为1
时返回1
行的数据表而不是数据行。这个操作会把数据行的顺序打乱,哪怕设置n
等于数据表的记录数。一般用于数据表的随机取样。另一种快速获取数据表中内容的方式使用属性规则和索引规则,如$table.first.field
,详见集合类型的元素访问。
COLLECT (column1, column2, ...) AS 'newColumn'
将指定的多个列合并成一列,要合并的列需要大于等于两个,否则无意义。newColumn
表示新的列名,注意必须加引号。合并的列是一个对象结构,包含合并前每一列的数据。DELETE
通过条件删除数据,条件支持AND
和OR
及使用小括号分组,但不支持函数。与WHERE
操作效果相反。注意表达式必须为字符串,作者暂时还没找到去掉引号的办法。
DISTINCT
选择字段并排重,返回一个新的数据表,可以理解为 SQL 语句中的SELECT DISTINCT ...
。
INSERT row
在数据表中插入一行。还用上面的例子,
INSERT (column1, column2) VALUES (value1, value2)
在数据表中插入一行,用 SQL 中 INSERT 语句的类似的语法。支持通过串连值插入多行数据。
INSERT IF EMPTY row
如果数据表为空时才插入数据。例子见INSERT row
。INSERT IF EMPTY (column1, column2) VALUES (value1, value2)
如果数据表为空时才插入数据,支持值串连。INSERT IF NOT EXISTS (column1, column2) VALUES (value1, value2)
如果数据表不存在指定的数据时才插入指定的数据,支持值串连。数据对比会比较所有指定的字段值。SELECT column1, column2
选择数据表中的一列或多列,生成新的数据表,支持*
和AS
。几种用法见下例:
SELECT
支持常用的五种简单的聚合操作,分别为SUM/COUNT/MAX/MIN/AVG
,必须使用AS
指定新的字段名,其中SUM/MAX/MIN/AVG
只支持单字段,函数内不支持字段运算。COUNT
中为空或数字表示仅计数,COUNT
内支持一个或多个字段,表示分组排重,注意其中多个字段时使用加号+
分隔而不是逗号,
。除聚合函数以外的字段均为分组依据,即省略了GROUP BY
,可以没有分组字段,那么结果只会有一行数据。
TO GROUPS
将数据表按照其中某一个字段的值分组成多个子表格。
返回值的结构可以是:
TO HTML TABLE
将数据表转化为 HTML 表格字符串,一般用于 Voyager 模板。
TO NESTED MAP 'column'
将数据表转化为一个嵌套的 Map 结构。如此非主流的操作来自于前端工程师的变态需求。数据表可以理解本身是一个数据行的数组,而数据行可以理解为是一个 Map 结构。现在前端工程师说数组不好处理,需要一个 Map,Map 每一项的值就是整个数据行。这个操作需要指定一列,前端工程师要的 Map 结构的 Key 就是这列的值(一般来说这列的每个值都是唯一的),然后数据表中每一行的其他值就构成了这个 Map 每一项的 Value。
这个操作的返回值是这样的:
TO TREE (primaryKey, parentColumn, startPoint, newColumn)
将一个数据表转成一个树形结构,这个功能常用于前端目录树的展示,在树形组件渲染中要求一次性获取所有节点的数据。其中primaryKey
和parentColumn
分别指定主键字段和父级关系字段,这两个字段用于确定目录的上下级关系。例如主键id
和父级关系字段parent_id
,id 为2
的目录有 3 个子目录,那么这 3 个子目录的 parent_id 值均为2
,即 id 为2
的目录。startPoint
表示顶层目录的父级 id,一般设置为0
。newColumn
设置聚合后字段名,如下例中的children
,当前目录的所有子节点都在这里。特别注意,找到不父级的目录都会被认为是顶级目录。
TURN column1 AND column2 TO ROW
或 TURN (column1, column2) TO ROW
将数据表中的column1
和column2
两列数据转成数据行, 列column1
的值做为数据行的字段名,列column2
的值作为数据行对应字段的值。
TURN TO ROW
将数据表第一列和第二列的数据转成数据行,第一列的值作为数据行的字段名,第二列的值作为数据对应字段的值。
UPDATE a='hello', b=2
将数据表中字段的值更新为常量。UPDATE
暂时不支持与WHERE
的联动运算。
UPDATE IF EMPTY a='hello'
如果字段a
的值为空字符串,则更新为指定的字符串。
UPDATE IF NULL a='hello', b=2
如果字段a
和b
的值为NULL
,则更新为指定的数值。
UPDATE IF UNDEFINED b=0
如果数据表不包含字段b
,则添加字段b
并赋值为指定的数值。
WHERE
通过条件筛选数据,条件支持AND
和OR
及使用小括号分组,但不支持函数。与DELETE
操作效果相反。注意表达式必须为字符串,作者暂时还没找到去掉引号的办法。
更复杂的表操作可以使用将数据保存到 SQLite 支持的内存数据库,见CACHE 语句 和 SAVE 语句中的相关内容。
聚合操作
待优化或移除。
AVG column
返回指定列的平均值。
COUNT
获取数据表的行数,返回一个整数。
SUM column
返回指定列的加和。
表内聚合操作可使用SELECT
。
其他操作
FIELDS
获得数据表的所有字段名的数组。
LABELS
获得数据表中所有字段名标签的数组。
HEADERS
获得数据表中的所有字段和标签对应表,返回数据行。
参考链接
- 集合类型的元素访问
- 更优雅的数据操作方法 Sharp 表达式
- Sharp 表达式操作 - 文本和字符串 TEXT
- Sharp 表达式操作 - 日期时间 DATETIME
- Sharp 表达式操作 - 数字 INTEGER/DECIMAL
- Sharp 表达式操作 - 正则表达式 REGEX
- Sharp 表达式操作 - 数组 ARRAY
- Sharp 表达式操作 - 数据行 ROW
- Sharp 表达式操作 - 数据判断
- Sharp 表达式操作 - Json 字符串
联系我们:wu@qross.io 手机/微信:18618171102