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

Posted

技术标签:

【中文标题】查询结果作为嵌套查询中的列名【英文标题】:Query result as column name in nested query 【发布时间】:2018-07-28 15:39:39 【问题描述】:

问题: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 解释为字符串。因此,它不是从 ColumnD 和 ColumnE 获取值,而是输出 'ColumnC'

【问题讨论】:

我什至不知道如果没有动态 SQL 是否可行,Big Query 甚至可能不支持,但我会说你的表设计真的很糟糕。如果要表示两个表之间的关系,通常通过设置连接列来实现。也就是说,table_1 中某列中的值指向table_2 中另一列中的值。 【参考方案1】:

以下是 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   

【讨论】:

选项 2 正是我想要的。棘手的,谢谢! 如果有帮助,请考虑对这个问题进行投票 - 看起来确实如此:o)

以上是关于查询结果作为嵌套查询中的列名的主要内容,如果未能解决你的问题,请参考以下文章

嵌套查询与连接查询的区别是啥

sql的嵌套查询,把一次查询的结果做为表继续进一步查询;内联视图

sql子查询 嵌套SELECT语句

sql子查询 嵌套SELECT语句

查询嵌套查询结果中的两列

sql子查询 嵌套SELECT实用语句