规范

输出字段名语义

qianmoQqianmoQ· 更新于 2026-09-29· 阅读 8 分钟· 0 次阅读

登录后可跨设备保存划线和私人笔记登录

输出字段名语义

本规范说明了应如何根据给定的用户查询生成输出记录批次中的字段名。字段名规则适用于由 SQL 查询和 DataFrame API 规划的 DataFusion 查询。

字段名规则

  • 所有裸列(bare column)的字段名都不得包含关系/表限定符。

    • SELECT t1.id、SELECT id 和 df.select_columns(&["id"]) 都应得到字段名:id
  • 所有复合列表达式的字段名都必须包含关系/表限定符。

    • SELECT foo + bar 应得到字段名:table.foo PLUS table.bar
  • 函数名必须转换为小写。

    • SELECT AVG(c1) 应得到字段名:avg(table.c1)
  • 字符串字面量不得被引号或双引号包裹。

    • SELECT 'foo' 应得到字段名:foo
  • 运算符表达式必须用括号包裹。

    • SELECT -2 应得到字段名:(- 2)
  • 运算符与操作数之间必须以空格分隔。

    • SELECT 1+2 应得到字段名:(1 + 2)
  • 函数参数之间必须以逗号 , 和一个空格分隔。

    • SELECT f(c1,c2) 和 df.select(vec![f.udf("f")?.call(vec![col("c1"), col("c2")])]) 应得到字段名:f(table.c1, table.c2)

附录

示例及与其他系统的比较

用于测试样例查询的数据模式:

CREATE TABLE t1 (id INT, a VARCHAR(5));
INSERT INTO t1 (id, a) VALUES (1, 'foo');
INSERT INTO t1 (id, a) VALUES (2, 'bar');

CREATE TABLE t2 (id INT, b VARCHAR(5));
INSERT INTO t2 (id, b) VALUES (1, 'hello');
INSERT INTO t2 (id, b) VALUES (2, 'world');

投影列

查询:

SELECT t1.id, a, t2.id, b
FROM t1
JOIN t2 ON t1.id = t2.id

DataFusion Arrow 记录批次输出:

idaidb
1foo1hello
2bar2world

Spark、MySQL 8 和 PostgreSQL 13 输出:

idaidb
1foo1hello
2bar2world

SQLite 3 输出:

idab
1foohello
2barworld

函数转换列

查询:

SELECT ABS(t1.id), abs(-id) FROM t1;

DataFusion Arrow 记录批次输出:

abs(t1.id)abs((- t1.id))
11
22

Spark 输出:

abs(id)abs((- id))
11
22

MySQL 8 输出:

ABS(t1.id)abs(-id)
11
22

PostgreSQL 13 输出:

absabs
11
22

SQlite 3 输出:

ABS(t1.id)abs(-id)
11
22

函数与运算符

查询:

SELECT t1.id + ABS(id), ABS(id * t1.id) FROM t1;

DataFusion Arrow 记录批次输出:

t1.id + abs(t1.id)abs(t1.id * t1.id)
21
44

Spark 输出:

id + abs(id)abs(id * id)
21
44

MySQL 8 输出:

t1.id + ABS(id)ABS(id * t1.id)
21
44

PostgreSQL 输出:

?column?abs
21
44

SQLite 输出:

t1.id + ABS(id)ABS(id * t1.id)
21
44

投影字面量

查询:

SELECT 1, 2+5, 'foo_bar';

DataFusion Arrow 记录批次输出:

1(2 + 5)foo_bar
17foo_bar

Spark 输出:

1(2 + 5)foo_bar
17foo_bar

MySQL 输出:

12+5foo_bar
17foo_bar

PostgreSQL 输出:

?column??column??column?
17foo_bar

SQLite 3 输出:

12+5‘foo_bar’
17foo_bar

评论

登录后参与评论

正在加载评论…