跳转到主要内容
  • numbers() – 返回一个无限表,其中只有一个 number 列 (UInt64) ,按升序包含从 0 开始的整数。使用 LIMIT (以及可选的 OFFSET) 可限制返回的行数。
  • numbers(N) – 返回一个只有单个 number 列 (UInt64) 的表,该列包含从 0 到 N - 1 的整数。
  • numbers(N, M) – 返回一个只有单个 number 列 (UInt64) 的表,该列包含从 NN + M - 1M 个整数。
  • numbers(N, M, S) – 返回一个只有单个 number 列 (UInt64) 的表,该列包含区间 [N, N + M) 内按步长 S 递增的值 (约为 M / S 行,向上取整) 。S 必须 >= 1
这与 system.numbers 系统表类似。可用于测试和生成连续值。 以下查询是等价的:
SELECT * FROM numbers(10);
SELECT * FROM numbers(0, 10);
SELECT * FROM numbers() LIMIT 10;
SELECT * FROM system.numbers LIMIT 10;
SELECT * FROM system.numbers WHERE number BETWEEN 0 AND 9;
SELECT * FROM system.numbers WHERE number IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9);
以下查询也等价:
SELECT * FROM numbers(10, 10);
SELECT * FROM numbers() LIMIT 10 OFFSET 10;
SELECT * FROM system.numbers LIMIT 10 OFFSET 10;
以下查询也同样等价:
SELECT number * 2 FROM numbers(10);
SELECT (number - 10) * 2 FROM numbers(10, 10);
SELECT * FROM numbers(0, 20, 2);

示例

前 10 个数。
SELECT * FROM numbers(10);
 ┌─number─┐
 │      0 │
 │      1 │
 │      2 │
 │      3 │
 │      4 │
 │      5 │
 │      6 │
 │      7 │
 │      8 │
 │      9 │
 └────────┘
生成从 2010-01-01 到 2010-12-31 的日期序列。
SELECT toDate('2010-01-01') + number AS d FROM numbers(365);
找出第一个 >= 10^15UInt64,其 sipHash64(number) 的末尾有 20 个零位。
SELECT number
FROM numbers()
WHERE number >= 1e15
  AND bitAnd(sipHash64(number), 0xFFFFF) = 0
LIMIT 1;
 ┌───────────number─┐
 │ 1000000000056095 │ -- 1.00 quadrillion
 └──────────────────┘

注意事项

  • 出于性能考虑,如果你知道自己需要多少行,建议优先使用有界形式 (numbers(N)numbers(N, M[, S])) ,而不是无界的 numbers() / system.numbers
  • 如需并行生成,请使用 numbers_mt(...)system.numbers_mt 表。请注意,返回结果的顺序可能是任意的。
最后修改于 2026年6月10日