最后于 更新
ARRAY_SHUFFLE
功能
ARRAY_SHUFFLE 用来随机打乱数组内元素的顺序。
语法
ARRAY_SHUFFLE(arr)ARRAY_SHUFFLE(arr, seed)
参数
arr:ARRAY<T>。seed:可选,表示随机数种子,必须是BIGINT类型的常量。
返回值
- 返回与输入同类型的数组,元素被随机重排,元素数量与类型均保持不变。
使用说明
- 输入的
arr是NULL时,返回NULL;seed是NULL时,也返回NULL。 - 每一行都会单独打乱,
arr是常量时也一样,所以相同的数组在不同行可能得到不同的顺序。 seed必须是常量,例如0或1 + 1。传入列或其他非常量表达式会报错。seed可以是任意BIGINT值,包括负数。64 位全部参与计算,所以-1和4294967295的结果不同。- 数据按批处理。每一批都从
seed开始生成一个随机数序列,批内的行依次使用这个序列。因此像ARRAY_SHUFFLE([1, 2, 3, 4], 0)这样的单次调用每次结果都相同;但在多行数据上,某一行的结果可能随数据的分批方式而变化。 - 不指定
seed时,每一批都使用新的随机种子,每次执行结果可能不同。 ARRAY_SHUFFLE的函数别名是SHUFFLE,两个函数功能一致。
示例
-
基本用法:
ARRAY_SHUFFLE([1, 2, 3, 4])-> 例如[3, 1, 4, 2](顺序随机)ARRAY_SHUFFLE(['a', null, 'b'])-> 例如['b', 'a', null]
-
指定种子(结果可复现):
ARRAY_SHUFFLE([1, 2, 3, 4], 0)-> 每次执行都得到[2, 1, 3, 4]
-
常量数组也会逐行打乱:
SELECT number, ARRAY_SHUFFLE([1, 2, 3, 4, 5], 0) FROM numbers("number" = "3") ORDER BY number-> 三行依次为[3, 1, 2, 4, 5]、[3, 5, 4, 2, 1]、[4, 5, 1, 3, 2]
-
负数种子也可以使用,并且 64 位全部参与计算:
ARRAY_SHUFFLE([1, 2, 3, 4], -1)->[4, 1, 3, 2],而ARRAY_SHUFFLE([1, 2, 3, 4], 4294967295)->[2, 4, 3, 1]
-
非常量的种子会报错:
SELECT ARRAY_SHUFFLE(arr, id) FROM t-> 报错The seed of array_shuffle must be a constant