sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

列操作命令 alignColumns / appendColumns / prependColumns / removeColumns / splitColumns

2026-08-20
sybn
sql

  • 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'}

注意事项

  1. 列操作命令都是后置命令,必须跟在 select 之后,用 ; 分隔。
  2. 可以链式调用多个列操作命令,例如 select ...; appendColumns(...); removeColumns(...);。
  3. appendColumns 和 prependColumns 的表达式可以引用前面刚追加的列(如 b+c as d 中的 b 和 c 是同一条命令追加的)。
  4. removeColumns 的 on all_empty 模式是全表判定——只有该列在所有行中都为空才会被删除。

Comments

暂不开放评论! 可微信联系