旧版 SQL 功能的可用性
本文档介绍了即将对 BigQuery 旧版 SQL 可用性施加的限制。这些限制基于评估期内的使用情况,将于 2026 年 6 月 1 日之后生效。这些更改是 BigQuery 从旧版 SQL 过渡到 GoogleSQL(BigQuery 推荐的符合 ANSI 标准的方言)的一部分。
与旧版 SQL 相比,迁移到 GoogleSQL 具有以下优势:
- 使用 BigQuery 高级运行时可提高性能,从而更经济实惠。
- 它支持旧版 SQL 不支持的功能,例如 DML 和 DDL 语句、通用表表达式 (CTE)、复杂的子查询和联接谓词、具体化视图、搜索索引和生成式 AI 函数。
功能可用性的运作方式
BigQuery 会在评估期间监控旧版 SQL 功能的使用情况。对于在 2025 年 11 月 1 日至 2026 年 6 月 1 日期间未使用旧版 SQL 的组织和项目,在评估期结束后,旧版 SQL 将变为不可用。对于在评估期间使用旧版 SQL 的组织和项目,您可以继续使用您所用的特定旧版 SQL 功能集来运行查询。
功能使用情况是在组织级层汇总的。如果组织内的任何项目使用某项功能,该组织内的所有其他项目都可以继续使用该功能。对于未与组织关联的项目,功能可用性在项目级进行管理。
旧版 SQL 功能集
旧版 SQL 功能分为三个功能集:基本语言功能、扩展语言功能和函数分组。以下各部分将详细介绍每个集合中的功能。
基本语言功能
这些功能是旧版 SQL 的核心。在评估期间,任何运行至少一个旧版 SQL 查询的组织或独立项目都可以使用此完整的功能集。
| 类别 | 特性 |
|---|---|
| 查询语法 |
|
| 表达式逻辑 | 字面量:
逻辑运算符:
比较函数:
控制流语句:
|
| 基本操作 | 算术运算符:
基本聚合函数:
|
| 数据元素 | 基本数据类型:
结构化和部分支持的数据类型:
类型转换函数:
强制转换:包括所有自动数据类型强制转换。 |
扩展的语言功能
此类别包含超出基本集范围的特定旧版 SQL 功能。与基本功能或功能分组不同,此类别中的每个功能都会单独跟踪。您必须在评估期内明确使用每项功能,才能继续使用这些功能。
| 类别 | 特性 |
|---|---|
| 扩展功能 |
函数分组
内置函数分为相关类别。在评估期内,如果使用分组中的任何单个函数,则整个分组中的所有函数都将可用。
| 功能分组 | 函数 |
|---|---|
| 高级窗口函数 |
|
| 用于统计信息的聚合函数 |
|
| 返回重复字段的聚合函数 |
|
| 使用位运算的聚合函数 |
|
| 使用串联的聚合函数 |
|
| 具有排序功能的聚合函数 |
|
| 基本窗口函数 |
|
| 按位函数 |
|
| 条件表达式 |
|
| 转换函数 |
|
| 当前时间函数 |
|
| 当前用户函数 |
|
| 日期和时间函数 |
|
| 函数 RAND |
|
| 返回重复字段的函数 |
|
| 哈希函数 |
|
| IP 函数 |
|
| JSON 函数 |
|
| 数学函数 |
|
| 数学双曲函数 |
|
| TIMESTAMP 函数的组成部分 |
|
| 正则表达式函数 |
|
| 字符串函数 |
|
| 网址函数 |
|
| UNIX 时间戳函数 |
|
功能可用性示例
以下示例展示了功能可用性的运作方式。
示例:使用基本语言功能
项目在评估期间运行旧版 SQL 查询。假设表 T 包含一个类型为 INTEGER 的列 X。
#legacySQL
SELECT X FROM T
这种使用方式可确保组织内的所有项目都能继续运行使用基本语言功能集中的任何功能的查询。例如,以下查询仍可正常运行:
#legacySQL
SELECT X FROM T WHERE X > 10
示例:使用函数分组
一个项目使用特定函数分组中的一个函数。假设表 T 包含一个类型为 FLOAT 的列 X。
#legacySQL
SELECT SIN(X) FROM T
使用 SIN() 函数可使整个数学函数分组可用。因此,组织中的所有项目都可以使用该分组中的任何其他函数,例如 COS()。
#legacySQL
SELECT COS(X) FROM T
相反,如果在评估期过后,组织中没有任何项目使用任何用于统计分组的聚合函数,则以下查询会失败。
#legacySQL
SELECT STDDEV(X) FROM T
示例:不同表中的功能保留情况
假设表 X 有一列 A (INTEGER),表 Y 有一列 B (FLOAT)。项目在评估期间运行以下查询:
#legacySQL
SELECT SIN(A) FROM X
组织可以在评估期结束后运行以下查询。
该查询之所以有效,是因为第一个查询保留了数学函数功能。保留时间与所用的特定表、列名或数据类型无关,因为 INTEGER 和 FLOAT 都是基本语言功能的一部分。
#legacySQL
SELECT COS(B) FROM Y
示例:复杂查询
假设表 T 包含一个类型为 STRING 的列 X。某个项目在评估期间运行了以下查询:
#legacySQL
SELECT value, AVG(FLOAT(value)) OVER (ORDER BY value) AS avg
FROM (
SELECT LENGTH(SPLIT(X, ',')) AS value
FROM T
)
此查询使用了基本语言功能和三个函数分组中的功能:基本窗口函数、字符串函数和返回重复值的函数。组织内的所有项目都将保留这些功能。 因此,使用相同保留功能集中的不同函数组合的新查询会成功。
#legacySQL
SELECT value, COUNT(STRING(value)) OVER (ORDER BY value) as count
FROM (
SELECT CONCAT(SPLIT(X, ','), '123') AS value
FROM T
)
常见问题解答
新组织可以使用旧版 SQL 吗?
评估期结束后,新组织或项目将无法使用旧版 SQL。在特殊情况下,您可以申请豁免。如果您无法访问 Google 表单,请发送电子邮件至 bq-legacysql-support@google.com,并在邮件中提供您的组织 ID、当前使用量、最近的使用日期、迁移挑战以及向 GoogleSQL 过渡的预计时间表。
现有的旧版 SQL 查询会停止运行吗?
只要现有查询使用的所有旧版 SQL 功能在评估期间被组织中的至少一个项目使用过,这些查询就会继续正常运行。如果查询依赖于此期间未使用的功能,则可能会失败,因此我们建议您确保运行所有关键查询。
使用旧版 SQL 的现有组织能否创建也使用旧版 SQL 的新项目?
可以。组织中的任何项目在评估期间访问过的所有功能,在评估期结束后仍可供组织中的所有项目(无论新旧)使用。
有没有工具可以检查我的组织使用了哪些旧版 SQL 功能?
目前没有可用于审核特定功能使用情况的工具。您可以按照每个项目的旧版 SQL 查询作业数中所述,通过查询 INFORMATION_SCHEMA.JOBS 视图来跟踪旧版 SQL 的使用情况。
您还可以在 Cloud Logging 中查看查询日志,以检查特定语法的使用情况。
是否必须迁移到 GoogleSQL?
虽然不是必须迁移,但建议您迁移。GoogleSQL 是一种现代、功能齐全且推荐使用的方言。
如果在评估期间,很少使用的旧版 SQL 查询未运行,会怎么样?
为确保查询继续正常运行,请在评估期间运行一次。如果您届时无法运行,可以申请豁免。如果您无法访问 Google 表单,请改为发送电子邮件到 bq-legacysql-support@google.com,并在邮件中附上您的组织 ID、当前使用量水平、最近的使用日期、迁移挑战以及向 GoogleSQL 过渡的预计时间表。
后续步骤
- 如需将查询从旧版 SQL 迁移到 GoogleSQL,请参阅迁移指南。