首页 > 解决方案 > 如何选择没有别名的 bigquery 表的第 n 列?

问题描述

sh-3.2$ bq shell
Welcome to BigQuery! (Type help for more information.)
bqaccount> select 1;
Waiting on bqjob_r42d56b0f0c2a3eb9_00000164b439b383_1 ... (0s) Current status: DONE
+-----+
| f0_ |
+-----+
|   1 |
+-----+
bqaccount> select f0_ from (select 1);
Error in query string: Error processing job 'bqaccount:bqjob_r7d8d3d2925de7c0c_00000164b439def3_1': Unrecognized name: f0_ at [1:8]

有没有办法从没有别名的查询中选择特定列?

标签: google-bigquery

解决方案


BigQuery 旧版 SQL 可以引用 fn_

#legacySQL
SELECT f2_, f0_, f1_
FROM (SELECT 1, 2, 3)

结果是

Row f2_ f0_ f1_  
1   3   1   2    

不过,BigQuery 标准 SQL 似乎不支持它

因此,以下是 BigQuery 标准 SQL 的一种解决方法

#standardSQL
SELECT 
  cols[OFFSET(0)],
  cols[OFFSET(1)],
  cols[OFFSET(2)],
  cols[OFFSET(3)],
  cols[OFFSET(4)]
FROM (SELECT 1, 2, 3, 'abc', CURRENT_DATE()) t, 
UNNEST([
  STRUCT<cols ARRAY<STRING>>(REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'"[^"]?":"?(\w*)"?'))
])

或相同方法的另一个版本(无论你会发现什么更适合你)

#standardSQL
SELECT 
  cols[OFFSET(0)],
  cols[OFFSET(1)],
  cols[OFFSET(2)],
  cols[OFFSET(3)],
  cols[OFFSET(4)]
FROM (
  SELECT REGEXP_EXTRACT_ALL(TO_JSON_STRING(t), r'"[^"]?":"?(\w*)"?') cols
  FROM (SELECT 1, 2, 3, 'abc', CURRENT_DATE()) t
)

结果

Row f0_ f1_ f2_ f3_ f4_  
1   1   2   3   abc 2018     

推荐阅读