REPLACE定位子元素的语句

时间:2016-07-11 14:39:06

标签: google-bigquery

有没有办法使用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]

2 个答案:

答案 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