- content
说明
sybn sql 提供了一组列操作命令,用于在前一条 sql 的结果集上增删改列。这些命令都是后置命令,必须跟在一条 select 语句之后,用分号 ; 分隔。
五个命令的职责:
| 命令 | 作用 | 是否改变行数 |
|---|---|---|
alignColumns |
对齐/筛选列 | 否 |
appendColumns |
在结尾追加新列 | 否 |
prependColumns |
在开头插入新列 | 否 |
removeColumns |
删除指定列(可按空值条件删) | 否 |
splitColumns |
将一列按分隔符拆成多列 | 否 |
共同特点:都不改变行数,只改变列结构;新列的表达式可以引用同行的已有列。
alignColumns - 对齐/筛选列
语法
select ...; alignColumns([字段1, 字段2 ...])
- 不传参数时,对齐 union 等场景下各行不一致的列(补齐缺失列为 null)。
- 传参数时,仅保留指定列(相当于 select 字段列表),其余列被丢弃。
例子
-- 不传参数:union 后两行列数不一致,alignColumns 补齐缺失列
select 1 as a, 2 as b
union select 11 as a, 33 as c;
alignColumns();
-- 结果:两行都有 a/b/c 三列,b 行 2 的 c 为 null,c 行 33 的 b 为 null
-- 传参数:仅保留 b、c 两列,丢弃 a 列
select 1 as a, 2 as b
union select 11 as a, 33 as c;
alignColumns(b, c);
-- 结果:两行都只有 b、c 两列
appendColumns - 在结尾追加新列
语法
select ...; appendColumns(表达式1 as 字段1, 表达式2 as 字段2, ...) [on concurrent=N]
表达式可以引用同行的已有列(包括前面刚追加的列)。on concurrent=N可选,对结果集的每一行并发执行表达式,N 为并发数。
例子
-- 基础用法:追加 b、c、d 三列,d 引用了刚追加的 b 和 c
select 1 as a;
appendColumns(2 as b, a+1 as c, b+c as d);
-- 结果:{a:1, b:2, c:2, d:4},列顺序为 a,b,c,d
-- 并发:对 5 行数据并发追加 name 列
select * from [{ip:'169.254.11.1'},{ip:'169.254.11.2'},{ip:'169.254.11.3'},{ip:'169.254.11.4'},{ip:'169.254.11.5'}];
appendColumns(1 as name) on concurrent=5;
-- 结果:每行追加 name:1,列顺序为 ip,name
prependColumns - 在开头插入新列
语法
select ...; prependColumns(表达式1 as 字段1, 表达式2 as 字段2, ...) [on concurrent=N]
- 语义与
appendColumns完全一致,唯一区别是新列被插入到列列表的开头。
例子
-- 新列 b、c、d 插入到 a 之前
select 1 as a;
prependColumns(2 as b, a+1 as c, b+c as d);
-- 结果:{b:2, c:2, d:4, a:1},列顺序为 b,c,d,a
-- 并发:对 5 行数据并发在开头插入 name 列
select * from [{ip:'169.254.11.1'},{ip:'169.254.11.2'},{ip:'169.254.11.3'},{ip:'169.254.11.4'},{ip:'169.254.11.5'}];
prependColumns(1 as name) on concurrent=5;
-- 结果:每行在开头插入 name:1,列顺序为 name,ip
removeColumns - 删除指定列
语法
select ...; removeColumns(字段1, 字段2, ...) [on all_empty=模式]
- 不带
on all_empty时,直接删除指定列。 - 带
on all_empty=模式时,仅当该列在所有行中都为”空”时才删除,否则保留。模式可选值:
| 模式 | 判定”空”的规则 |
|---|---|
auto(默认) |
仅空字符串 '' 视为空;空格、0、null 都不视为空 |
blank |
trim 后为空字符串视为空(含 ''、' '、'\t') |
zero |
数值 0 或 0.0 视为空(字符串 '0' 不视为空) |
zeroString |
在 zero 基础上,字符串 '0'(含 ' 0 ')也视为空 |
(v1, v2, ...) |
自定义空值列表,如 (null, '', '0', 'N/A') |
例子
-- 基础用法:直接删除 a 列
select 1 as a, 2 as b;
removeColumns(a);
-- 结果:{b:2}
-- auto 模式:只有空字符串被删除,空格和 0 保留
select '' as a, ' ' as b, 0 as c;
removeColumns(a, b, c) on all_empty=auto;
-- 结果:{b:' ', c:0}(a 被删除)
-- blank 模式:trim 后为空的列都被删除
select '' as a, ' ' as b, '\t' as c;
removeColumns(a, b, c) on all_empty=blank;
-- 结果:{}(三列都被删除)
-- zero 模式:数值 0 被删除,字符串 '0' 保留
select 0 as a, 0.0 as b, '0' as c;
removeColumns(a, b, c) on all_empty=zero;
-- 结果:{c:'0'}(a、b 被删除)
-- zeroString 模式:字符串 '0' 也被删除
select '0' as a, ' 0 ' as b, 'abc' as c;
removeColumns(a, b, c) on all_empty=zeroString;
-- 结果:{c:'abc'}(a、b 被删除)
-- 自定义空值列表
select null as a, '' as b, '0' as c, 'N/A' as d, 'other' as e;
removeColumns(a, b, c, d, e) on all_empty=(null, '', '0', 'N/A');
-- 结果:{e:'other'}(前四列被删除)
splitColumns - 拆分列为多列
语法
select ...; splitColumns(字段, [分隔符, [列名前缀]])
字段:要拆分的列名。分隔符:可选,默认为逗号,。列名前缀:可选,拆分后的新列名为前缀 + 拆分值,默认无前缀(直接用拆分值作为列名)。
例子
-- 默认逗号分隔:把 b 列按逗号拆成 x、y、z 三列
select 1 as a, 'x,y,z' as b;
splitColumns(b);
-- 结果:{a:1, x:'x', y:'y', z:'z'}
-- 自定义分隔符和前缀:按空格拆分,新列名加 f_ 前缀
select 1 as a, 'x y z' as b;
splitColumns(b, ' ', 'f_');
-- 结果:{a:1, f_x:'x', f_y:'y', f_z:'z'}
注意事项
- 列操作命令都是后置命令,必须跟在 select 之后,用
;分隔。 - 可以链式调用多个列操作命令,例如
select ...; appendColumns(...); removeColumns(...);。 appendColumns和prependColumns的表达式可以引用前面刚追加的列(如b+c as d中的 b 和 c 是同一条命令追加的)。removeColumns的on all_empty模式是全表判定——只有该列在所有行中都为空才会被删除。