问题: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'
答案 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