首先,错误消息中看起来很疯狂的建议实际上可以工作——而不是你的AS chrLv,而是AS f0_group.chrLv。我什至不会尝试解释确切的原因,因为我真的不能,但我可以提供一些背景信息,说明这件事何时发生以及如何解决它。
这里的关键是SPLIT。 SPLIT 创建repeated values,其中单行单列包含多个值。
当您SPLIT "a,b,c" as val 时,直接结果是 single 行,其架构会显示为 val: string (repeated)。
当您使用 SPLIT 运行查询时,默认情况下,查询结果是展平的:包含 3 次重复值的单行将变成 3 行。当您尝试保存视图时,行为有所不同:它不会变平。这就是您可以查询但不能保存视图的原因。 (如果需要,您可以通过设置查询选项来重现未展平的行为:取消选中“展平结果”(也称为“允许大”和“选择表格”)。)
那么,为什么未展平结果会出现有趣的错误呢?当您将函数应用于重复值时会发生这种情况。 SPLIT 创建重复输出,INTEGER 应用于此,在表达式的架构中触发意外。
解决方法是在应用该函数之前删除重复性(将其展平为多行)。首先是SPLIT,然后是FLATTEN,然后是INTEGER。像这样:
SELECT
userId,
lv,
INTEGER(chrLvStr) as chrLv
FROM FLATTEN(
(
SELECT
userId,
lv,
SPLIT( REGEXP_REPLACE( REGEXP_REPLACE(chrLvs, r'\[', ''), r'\]', ''), ",") AS chrLvStr
FROM [test.setup_chr_lvs]
),
chrLvStr
)
这会运行(并且可以保存为视图),其中[test.setup_chr_lvs] 是从此查询中保存的数据的单行模型:
select "user1" as userId, "lv1" as lv, "[1, 24, 344]" as chrLvs
(不,我没有用于FLATTEN 的缩进约定。)