有没有办法使用REPLACE来定位STRUCT的子元素?
理想情况下,它的工作方式如下所示:
WITH sub1 AS (
SELECT STRUCT('foo' as name) data UNION ALL
SELECT STRUCT('bar')
)
SELECT * REPLACE(2 as data.name) FROM sub1
目前它会触发以下错误:
Error: Syntax error: Expected ")" but got "." at [5:27]
答案 0 :(得分:0)
为您的特定示例 - 尝试
WITH sub1 AS (
SELECT STRUCT('foo' as name) data UNION ALL
SELECT STRUCT('bar')
)
SELECT * REPLACE(2 as data) FROM sub1
见下面更一般的例子
WITH sub1 AS (
SELECT STRUCT('foo' AS name, 1 AS id) data UNION ALL
SELECT STRUCT('bar', 2)
)
SELECT * REPLACE(STRUCT('replacement name' AS name, data.id) AS data)
FROM sub1
答案 1 :(得分:0)
我找到了一个有趣的解决方案:
WITH sub1 AS (
SELECT STRUCT('foo' AS name, 1 AS id) data UNION ALL
SELECT STRUCT('bar', 2)
)
SELECT data.* REPLACE('replacement name' AS name) FROM sub1
PRO:此解决方案避免键入所有字段(当你有很多字段时非常方便)
CON:权衡是输出结构的变化。 我仍然在寻找一种方法来再次嵌套它而不列出所有字段
如果您确实需要保留结构,可以使用以下查询(由Danny Kitt提供):
WITH sub1 AS (
SELECT STRUCT('foo' AS name, 1 AS id) data UNION ALL
SELECT STRUCT('bar', 2)
)
SELECT data FROM (SELECT data.* REPLACE('replacement name' AS name) FROM sub1) data
为了解一下这个用例:当你想要生成几个移动字段的灯具时,这种查询非常有用:
WITH
fixture AS (
SELECT id FROM UNNEST([1,2,3,4,5]) id
),
template AS (
SELECT STRUCT(
NULL AS id,
NULL AS name,
NULL AS field3,
NULL AS field4,
NULL AS field5,
NULL AS field6,
NULL AS field7
) data
)
SELECT data FROM (SELECT data.* REPLACE(
fixture.id AS id,
CONCAT("name", CAST(fixture.id AS STRING)) AS name
) FROM template,fixture) data