Google bigquery BigQuery:使用数组_CONCAT()进行查询会导致错误

Google bigquery BigQuery:使用数组_CONCAT()进行查询会导致错误,google-bigquery,Google Bigquery,假设以下查询(从更复杂的查询简化): 结果是数组[1,2,3,4,5,6] 在以下查询(with语句)中重新格式化会导致错误“ARRAY_CONCAT(或ARRAY_CONCAT_AGG)的参数必须是数组类型,但在[3:8]处为STRUCT,ARRAY,ARRAY> WITH q1 AS (SELECT ([1, 2], [3, 4], [5, 6]) as count_to_six) SELECT ARRAY_CONCAT(count_to_six) FROM q1 我的问题是:在“WITH

假设以下查询(从更复杂的查询简化):

结果是数组[1,2,3,4,5,6]

在以下查询(with语句)中重新格式化会导致错误“ARRAY_CONCAT(或ARRAY_CONCAT_AGG)的参数必须是数组类型,但在[3:8]处为STRUCT,ARRAY,ARRAY>

WITH q1 AS
(SELECT ([1, 2], [3, 4], [5, 6]) as count_to_six)
SELECT ARRAY_CONCAT(count_to_six) FROM q1

我的问题是:在“WITH AS”-查询中,如何获得与初始查询相同结果的正确查询?

使用逗号分隔列表周围的括号创建一个结构,因此示例中的WITH子句创建一个包含三个数组字段的结构。您可以这样做:

WITH q1 AS (
  SELECT [1, 2] AS count_to_six UNION ALL
  SELECT [3, 4] UNION ALL
  SELECT [5, 6]
)
SELECT ARRAY_CONCAT_AGG(count_to_six)
FROM q1
这将在WITH子句中创建三行输入,每行都有一个包含两个元素的数组,然后将它们连接到一个数组中。但是请注意,数组的顺序并不能保证,除非您以某种方式利用
ARRAY\u CONCAT\u AGG
中的ORDER BY子句

如果确实要使用
ARRAY\u CONCAT
,则需要命名结构的每个字段,然后在函数调用中引用它:

WITH q1 AS (
  SELECT STRUCT([1, 2] AS x, [3, 4] AS y, [5, 6] AS z) AS count_to_six
)
SELECT
  ARRAY_CONCAT(count_to_six.x, count_to_six.y, count_to_six.z)
FROM q1

在本例中,结果数组中元素的顺序定义良好。

下面是针对BigQuery标准SQL的

#standardSQL 
WITH q1 AS (
  SELECT [1, 2] AS arr1, [3, 4] AS arr2, [5, 6] AS arr3
)
SELECT ARRAY_CONCAT(arr1, arr2, arr3) AS count_to_six
FROM q1  
另一个选项-更通用,但比第一个选项重一点(但无论如何,您提到它将是更复杂查询的一部分)
我认为它最像你最初的期望

#standardSQL 
WITH q1 AS (
  SELECT STRUCT([1, 2], [3, 4], [5, 6]) AS line 
)
SELECT 
  ARRAY(SELECT CAST(item AS INT64) FROM UNNEST(new_line) item) AS count_to_six 
FROM (
  SELECT 
    (SELECT ARRAY_CONCAT_AGG(SPLIT(arr)) 
      FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(q1), r'\[(.+?)]')) arr
    ) new_line
  FROM q1
)

谢谢你,艾略特。为了让我理解,是否也可以保持“使用q1作为(选择([1,2],[3,4],[5,6])作为计数(从[u到[u六])”的原样,并将结构转换为SELECT语句中的数组,在AS()之外使用,以便数组(u CONCAT())可以用于所需的结果?我编辑了我的答案,以显示这一点。如果不以某种方式在结构字段上强加名称,就不能按原样使用WITH子句。好的。我刚刚尝试了将结构的每个字段命名为的查询,但这导致了一个错误:语法错误:括号中的表达式无法在[2:11]处解析为表达式、结构构造函数或子查询。实际上,为了使用别名,您需要使用struct关键字。感谢Mikhail提供的有用反馈,它可以正常工作。
#standardSQL 
WITH q1 AS (
  SELECT STRUCT([1, 2], [3, 4], [5, 6]) AS line 
)
SELECT 
  ARRAY(SELECT CAST(item AS INT64) FROM UNNEST(new_line) item) AS count_to_six 
FROM (
  SELECT 
    (SELECT ARRAY_CONCAT_AGG(SPLIT(arr)) 
      FROM UNNEST(REGEXP_EXTRACT_ALL(TO_JSON_STRING(q1), r'\[(.+?)]')) arr
    ) new_line
  FROM q1
)