查询结果作为嵌套查询中的列名

时间:2018-07-28 15:39:40

标签: google-bigquery standard-sql

问题:BigQuery将行值解释为字符串而不是列名。

我有两个表:

table_1
| ColumnA  | ColumnB  | ColumnC  |
| 123      | 345      | ColumnD  |
| 678      | 900      | ColumnE  |


table_2
| ColumnD | ColumnE | ColumnF |
| nn      | xx      | 123     |
| kk      | yy      | 678     |

我现在要做的是合并两个表,并根据table_1中的行从table_2中的列中选择值。

类似的东西:

SELECT 
   (SELCT ColumnC FROM table_2 WHERE ColumnF = table_1.ColumnA ) 
FROM table_1

问题在于BigQuery将ColumnC解释为String。因此,与其从ColumnD和ColumnE中获取值,不如直接输出'ColumnC'

1 个答案:

答案 0 :(得分:2)

以下是用于BigQuery标准SQL

  

选项1-您预先知道table_2中的列名,并且列名不多,因此您可以在查询中按如下所示逐一检查它们

#standardSQL
SELECT a.*,
  CASE 
    WHEN ColumnC = 'ColumnD' THEN ColumnD
    WHEN ColumnC = 'ColumnE' THEN ColumnE   
  END value
FROM `project.dataset.table_1` a
LEFT JOIN `project.dataset.table_2` b
ON ColumnF = ColumnA    

如果要应用到您的问题中的虚拟数据-它会为您提供以下结果

Row ColumnA ColumnB ColumnC value    
1   123     345     ColumnD nn   
2   678     900     ColumnE yy    
  

选项2-列的动态评估,假设布局很简单(如您所讨论的示例中所示),但允许运行查询而不必担心table_2中有多少列,并且您甚至不需要知道它们的名称(当然,除了columnF,因为它是JOIN键)

#standardSQL
SELECT a.*,
  (SELECT SPLIT(x,':')[OFFSET(1)]
    FROM UNNEST(SPLIT(REGEXP_REPLACE(TO_JSON_STRING(b), r'[{}"]', ''))) x
    WHERE SPLIT(x,':')[OFFSET(0)] = ColumnC
  ) value
FROM `project.dataset.table_1` a
LEFT JOIN `project.dataset.table_2` b
ON ColumnF = ColumnA   

此查询将返回与选项1完全相同的结果

Row ColumnA ColumnB ColumnC value    
1   123     345     ColumnD nn   
2   678     900     ColumnE yy