在具有相同架构的表上使用 UNION ALL 的 Google Big Query 中的 SQL 错误编辑:架构从 String 更改为 INT

Posted

技术标签:

【中文标题】在具有相同架构的表上使用 UNION ALL 的 Google Big Query 中的 SQL 错误编辑:架构从 String 更改为 INT【英文标题】:SQL Error in Google Big Query with UNION ALL on tables with same schema EDIT: change in schema from String to INT 【发布时间】:2019-03-16 01:59:58 【问题描述】:

我有以下问题

 SELECT *
  FROM `January_2018`

UNION ALL

 SELECT *
  FROM `February_2018`

我在第二次SELECT 调用时收到以下错误

UNION ALL 中的第 14 列具有不兼容的类型:STRING、STRING、INT64、 INT64、INT64、INT64、INT64、INT64、INT64、INT64、INT64、INT64 在 [7:3]

列名为 travel_type,类型为整数,值为 0、1 和 2。

我正在尝试从几个较小的表格中制作一张大表格 - 相同数据的月度表格。似乎其中一个字段在第 4 个月后已从 String 数据类型更改为 Int 数据类型,并在此之后保持 Int 持续。

【问题讨论】:

UNION 要求将两个查询放在一起以返回相同数量的列,并且成对的列具有相同的数据类型。您需要确保查询返回的列符合该约束... 将根据您的输入编辑问题。请看问题。 【参考方案1】:

尝试以下操作,以便两个表架构匹配:

SELECT * EXCEPT(changed_column)
  , CAST(changed_column AS STRING) AS changed_column
FROM table1
UNION ALL
SELECT * EXCEPT(changed_column)
  , CAST(changed_column AS STRING) AS changed_column
FROM table2

【讨论】:

前3个表是字符串,其他12个左右是Int。前 3 个应该改为 CAST(changed_column as INT) as changed_column 吗? 我按照您的建议进行了尝试,但改为转换为 INT64。我现在收到此错误Bad int64 value: NULL 如果CAST 不起作用,因为不是所有东西都可以投射,试试SAFE_CAST【参考方案2】:

要从不同的表中选择数据,您可以使用通配符而不是联合。通配符将在满足条件的所有表上执行您的查询。您可以使用带有表前缀的通配符“*”一次选择多个表。您的表名必须具有相同的前缀和不同的后缀。例如——Mytable_1、Mytabel_2、Mytable_3…………

【讨论】:

以上是关于在具有相同架构的表上使用 UNION ALL 的 Google Big Query 中的 SQL 错误编辑:架构从 String 更改为 INT的主要内容,如果未能解决你的问题,请参考以下文章

union和union all 的写法

在列数相等的表上应用 UNION 时出现“无法创建行...大于允许的最大行大小”错误

有啥方法可以在同一个大表上使用 3x UNION All 来加速复杂查询?

Bigquery - UNION ALL 具有不同参数的相同查询

如何获取不在内部连接sql中的列,使用union all是很多时间

UNION ALL UNION