旧版 SQL 功能的可用性

本文档介绍了即将对 BigQuery 旧版 SQL 可用性施加的限制。这些限制基于评估期内的使用情况,将于 2026 年 6 月 1 日之后生效。这些更改是 BigQuery 从旧版 SQL 过渡到 GoogleSQL(BigQuery 推荐的符合 ANSI 标准的方言)的一部分。

与旧版 SQL 相比,迁移到 GoogleSQL 具有以下优势:

功能可用性的运作方式

BigQuery 会在评估期间监控旧版 SQL 功能的使用情况。对于在 2025 年 11 月 1 日至 2026 年 6 月 1 日期间未使用旧版 SQL 的组织和项目,在评估期结束后,旧版 SQL 将变为不可用。对于在评估期间使用旧版 SQL 的组织和项目,您可以继续使用您所用的特定旧版 SQL 功能集来运行查询。

功能使用情况是在组织级层汇总的。如果组织内的任何项目使用某项功能,该组织内的所有其他项目都可以继续使用该功能。对于未与组织关联的项目,功能可用性在项目级进行管理。

旧版 SQL 功能集

旧版 SQL 功能分为三个功能集:基本语言功能、扩展语言功能和函数分组。以下各部分将详细介绍每个集合中的功能。

基本语言功能

这些功能是旧版 SQL 的核心。在评估期间,任何运行至少一个旧版 SQL 查询的组织或独立项目都可以使用此完整的功能集。

类别 特性
查询语法
  • SELECT
  • FROM
  • JOIN
  • WHERE
  • GROUP BY
  • HAVING
  • ORDER BY
  • LIMIT
表达式逻辑 字面量
  • TRUE
  • FALSE
  • NULL

逻辑运算符
  • AND
  • OR
  • NOT

比较函数
  • =
  • !=
  • <>
  • <
  • <=
  • >
  • >=
  • IN
  • IS NULL
  • IS NOT NULL
  • IS_EXPLICITLY_DEFINED
  • IS_INF
  • IS_NAN
  • ... BETWEEN ... AND ...

控制流语句
  • IF
  • IFNULL
  • CASE WHEN … THEN …
基本操作 算术运算符
  • +
  • -
  • *
  • /
  • %

基本聚合函数
  • AVG
  • COUNT
  • FIRST
  • LAST
  • MAX
  • MIN
  • NTH
  • SUM
数据元素 基本数据类型
  • BYTES
  • BOOLEAN
  • FLOAT
  • INTEGER
  • STRING
  • TIMESTAMP

结构化和部分支持的数据类型
  • 精确数值:NUMERICBIGNUMERIC
  • 民用时间:DATETIMEDATETIME
  • 结构化字段:嵌套字段、重复字段

类型转换函数
  • CAST(expr AS type)
  • BOOLEAN
  • BYTES
  • FLOAT
  • INTEGER
  • STRING

强制转换:包括所有自动数据类型强制转换。

扩展的语言功能

此类别包含超出基本集范围的特定旧版 SQL 功能。与基本功能或功能分组不同,此类别中的每个功能都会单独跟踪。您必须在评估期内明确使用每项功能,才能继续使用这些功能。

类别 特性
扩展功能

函数分组

内置函数分为相关类别。在评估期内,如果使用分组中的任何单个函数,则整个分组中的所有函数都将可用。

功能分组 函数
高级窗口函数
  • CUME_DIST
  • DENSE_RANK
  • FIRST_VALUE
  • LAG
  • LAST_VALUE
  • LEAD
  • NTH_VALUE
  • NTILE
  • PERCENT_RANK
  • PERCENTILE_CONT
  • PERCENTILE_DISC
  • RANK
  • RATIO_TO_REPORT
  • ROW_NUMBER
用于统计信息的聚合函数
  • CORR
  • COVAR_POP
  • COVAR_SAMP
  • STDDEV
  • STDDEV_POP
  • STDDEV_SAMP
  • VARIANCE
  • VAR_POP
  • VAR_SAMP
返回重复字段的聚合函数
  • NEST
  • QUANTILES
  • UNIQUE
使用位运算的聚合函数
  • BIT_AND
  • BIT_OR
  • BIT_XOR
使用串联的聚合函数
  • GROUP_CONCAT
  • GROUP_CONCAT_UNQUOTED
具有排序功能的聚合函数
  • COUNT([DISTINCT])
  • EXACT_COUNT_DISTINCT
  • TOP ... COUNT(*)
基本窗口函数
  • AVG
  • COUNT(*)
  • COUNT([DISTINCT])
  • MAX
  • MIN
  • STDDEV
  • SUM
按位函数
  • &
  • |
  • ^
  • <<
  • >>
  • ~
  • BIT_COUNT
条件表达式
  • COALESCE
  • EVERY
  • GREATEST
  • LEAST
  • NVL
  • SOME
转换函数
  • FROM_BASE64
  • HEX_STRING
  • TO_BASE64
当前时间函数
  • NOW
  • CURRENT_DATE
  • CURRENT_TIME
  • CURRENT_TIMESTAMP
当前用户函数
  • CURRENT_USER
日期和时间函数
  • DATE
  • DATE_ADD
  • DATEDIFF
  • TIME
  • TIMESTAMP
函数 RAND
  • RAND
返回重复字段的函数
  • POSITION
  • SPLIT
哈希函数
  • HASH
  • SHA1
  • FARM_FINGERPRINT
IP 函数
  • FORMAT_IP
  • FORMAT_PACKED_IP
  • PARSE_IP
  • PARSE_PACKED_IP
JSON 函数
  • JSON_EXTRACT
  • JSON_EXTRACT_SCALAR
数学函数
  • ABS
  • ACOS
  • ASIN
  • ATAN
  • ATAN2
  • CEIL
  • COS
  • DEGREES
  • EXP
  • FLOOR
  • LN
  • LOG
  • LOG10
  • LOG2
  • PI
  • POW
  • RADIANS
  • ROUND
  • SIN
  • SQRT
  • TAN
数学双曲函数
  • ACOSH
  • ASINH
  • ATANH
  • COSH
  • SINH
  • TANH
TIMESTAMP 函数的组成部分
  • DAY
  • DAYOFWEEK
  • DAYOFYEAR
  • HOUR
  • MINUTE
  • MONTH
  • QUARTER
  • SECOND
  • WEEK
  • YEAR
正则表达式函数
  • REGEXP_MATCH
  • REGEXP_EXTRACT
  • REGEXP_REPLACE
字符串函数
  • CONTAINS
  • CONCAT
  • INSTR
  • LEFT
  • LENGTH
  • LOWER
  • LPAD
  • LTRIM
  • REPLACE
  • RIGHT
  • RPAD
  • RTRIM
  • SUBSTR
  • UPPER
网址函数
  • HOST
  • DOMAIN
  • TLD
UNIX 时间戳函数
  • FORMAT_UTC_USEC
  • MSEC_TO_TIMESTAMP
  • PARSE_UTC_USEC
  • SEC_TO_TIMESTAMP
  • STRFTIME_UTC_USEC
  • TIMESTAMP_TO_SEC
  • TIMESTAMP_TO_MSEC
  • TIMESTAMP_TO_USEC
  • USEC_TO_TIMESTAMP
  • UTC_USEC_TO_DAY
  • UTC_USEC_TO_HOUR
  • UTC_USEC_TO_MONTH
  • UTC_USEC_TO_WEEK
  • UTC_USEC_TO_YEAR

功能可用性示例

以下示例展示了功能可用性的运作方式。

示例:使用基本语言功能

项目在评估期间运行旧版 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

组织可以在评估期结束后运行以下查询。 该查询之所以有效,是因为第一个查询保留了数学函数功能。保留时间与所用的特定表、列名或数据类型无关,因为 INTEGERFLOAT 都是基本语言功能的一部分。

#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,请参阅迁移指南