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