以下是我的查询的简化版本。Debug 表中的 DebugReason 类型为INTEGER,DebugData 类型为STRING。GPS 表中没有这样的两个字段,所以我用 all 伪造了它NULL。我需要这样做的原因与这个问题无关,长话短说,我在接下来的一些过程中需要它
WITH RawDebug as
(
SELECT
STRUCT(DebugReason,DebugData) as Debug
FROM `devicedata.Debug.T*`
WHERE _TABLE_SUFFIX="20180624"
),
RawGPS AS (
SELECT
STRUCT(null as DebugReason,null as DebugData) as Debug
FROM
`devicedata.Gps.T*` AS g
WHERE _TABLE_SUFFIX="20180624"
)
select Debug
from RawDebug
UNION ALL
select Debug
from RawGPS
Run Code Online (Sandbox Code Playgroud)
BigQuery 说:
Error: Column 1 in UNION ALL has incompatible types: STRUCT<DebugReason INT64, DebugData STRING>, STRUCT<DebugReason INT64, DebugData INT64> at [18:1]
Run Code Online (Sandbox Code Playgroud)
我不知道出了什么问题......以及如何纠正?
在联合中的一个查询中,该DebugData字段的类型为 type STRING,而在另一个查询中,该字段的类型为 type INT64。如果你想要一致的类型,你需要强制转换:
WITH RawDebug as
(
SELECT
STRUCT(DebugReason,DebugData) as Debug
FROM `devicedata.Debug.T*`
),
RawGPS AS (
SELECT
STRUCT(
null as DebugReason,
CAST(DebugData AS STRING) AS DebugData -- note the cast
) as Debug
FROM
`devicedata.Gps.T*` AS g
)
select Debug
from RawDebug
UNION ALL
select Debug
from RawGPS
Run Code Online (Sandbox Code Playgroud)
发生这种情况是因为 的默认类型NULL是INT64.
另一种选择是显式指定 STRUCT,如下所示
WITH RawDebug AS
(
SELECT
STRUCT(DebugReason,DebugData) AS Debug
FROM `devicedata.Debug.T*`
WHERE _TABLE_SUFFIX="20180624"
),
RawGPS AS (
SELECT
STRUCT<DebugReason INT64, DebugData STRING>(NULL, NULL) AS Debug
FROM
`devicedata.Gps.T*` AS g
WHERE _TABLE_SUFFIX="20180624"
)
SELECT Debug
FROM RawDebug
UNION ALL
SELECT Debug
FROM RawGPS
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
20932 次 |
| 最近记录: |